앱을 열 때 실행할 활동을 어떻게 동적으로 선택합니까?
서비스를 사용하기 전에 로그인해야 하는 앱을 작성 중입니다. 지금까지 Android에 대한 나의 이해에서 매니페스트의 런처에서 열 때 시작할 활동을 선택해야 합니다. 컴파일 타임에 어떤 활동을 시작하고 싶은지 모르겠습니다. 사용자가 아이콘을 클릭하도록 한 다음 로그인했는지 확인한 다음 로그인 활동을 시작할지 아니면 기본 앱 활동을 시작할지 여부를 결정합니다. 이 작업을 수행하는 방법이 있습니까?
아니요, 일부 코드를 실행해야 하기 때문에 선언적으로(매니페스트에서) 이것을 말할 방법이 없습니다. 활동(매니페스트에 설정)을 시작한 다음 사용자가 로그온했는지 여부에 따라 이 활동이 Intent를 통해 시작할 두 번째 활동을 결정하도록 해야 합니다.
final Class<? extends Activity> activityClass;
if(userIsLoggedOn())
activityClass = LoggedOnActivity.class;
else
activityClass = LogInActivity.class;
Intent newActivity = new Intent(context, activityClass);
context.startActivity(newActivity);
activity-alias 를 사용하여 이를 수행하는 또 다른 방법이 있습니다 .
매니페스트에서:
<activity android:name=".LoginActivity" android:icon="@drawable/ic_launcher_main" android:label="Login" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".MainActivity" android:icon="@drawable/ic_launcher_main" android:label="MainActivity" > </activity> <activity-alias android:name=".AliasActivity" android:label="AliasActivity" android:enabled="false" android:targetActivity=".MainActivity" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity-alias>
2. 로그인 활동의 어딘가:
String s = getApplicationContext().getPackageName(); ComponentName cm = new ComponentName(s, s+".AliasActivity"); ComponentName cm2 = new ComponentName(s, s+".Login"); PackageManager pm = this.getPackageManager(); pm.setComponentEnabledSetting(cm, PackageManager.COMPONENT_ENABLED_STATE_ENABLED, 1); pm.setComponentEnabledSetting(cm2, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, 0);
그 후에 앱은 한 번 종료되고 다음에 앱을 시작할 때 MainActivity가 런처가 됩니다.
Android Framework는 메소드를 제공합니다.
public Intent setClassName (String packageName, String className)
String의 클래스 이름만으로 호출할 활동을 동적으로 선택하는 데 사용할 수 있는 Intent 클래스의
다음은 예입니다.
String packageName = getPackageName(), className=packageName+"subFolder.myActivity";
Intent i = new Intent();
i.setClassName(packageName, className);
startActivity(i);
@auval님이 말씀하신대로 아래와 같이 코드를 테스트해보니 잘 됩니다! 처음에 AndroidManifest.xml 파일은 다음과 같습니다.
<activity
android:name=".LauncherActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<activity
android:name=".MainActivity">
</activity>
<activity-alias
android:name=".AliasActivity"
android:enabled="false"
android:targetActivity=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity-alias>
둘째, 이 코드를 MainActivity.class의 어딘가에 넣을 수 있습니다.
private void changeLauncher() {
String s = getApplicationContext().getPackageName();
ComponentName cm = new ComponentName(s, s + ".AliasActivity");
ComponentName cm2 = new ComponentName(s, s + ".LauncherActivity");
PackageManager pm = this.getPackageManager();
pm.setComponentEnabledSetting(cm,
PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
PackageManager.DONT_KILL_APP );
pm.setComponentEnabledSetting(cm2,
PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
PackageManager.DONT_KILL_APP);
}
Now,when you first launch the app ,the LauncherActivity would be launched and when you exit the app ,run the app again,the MainActivity would be launched.
ReferenceURL : https://stackoverflow.com/questions/2776116/how-do-i-dynamically-choose-which-activity-to-launch-when-opening-an-app
'IT이야기' 카테고리의 다른 글
스타일 구성요소의 조건부 렌더링 (0) | 2022.03.05 |
---|---|
DB테이블, 컬럼, 상수, 변수 등 약어 모음 (0) | 2021.11.28 |
Scala(및 Java)에서 클래스와 유형의 차이점 (0) | 2021.10.28 |
Node.js에서 이메일 수신 (0) | 2021.10.28 |
로그인 시나트라? (0) | 2021.10.28 |