IT이야기

앱을 열 때 실행할 활동을 어떻게 동적으로 선택합니까?

cyworld 2021. 10. 28. 19:22
반응형

앱을 열 때 실행할 활동을 어떻게 동적으로 선택합니까?


서비스를 사용하기 전에 로그인해야 하는 앱을 작성 중입니다. 지금까지 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 를 사용하여 이를 수행하는 또 다른 방법이 있습니다 .

  1. 매니페스트에서:

    <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); 

https://developer.android.com/reference/android/content/Intent.html#setClassName(java.lang.String,%20java.lang.String)


@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

반응형