如何在打开应用程序时动态选择要启动的活动

msf*_*ein 53 android android-manifest

我正在编写一个应用程序,要求您在使用之前登录服务.根据我对android到目前为止的理解,你必须选择从清单中的启动器打开时要启动的活动.我不知道我想在编译时启动哪个活动.我希望用户单击该图标,然后检查并查看他们是否已登录,然后根据是否启动登录活动或主应用程序活动来决定.有没有办法做到这一点?

Ric*_*mil 64

不,因为你必须运行一些代码,所以没有办法以声明的方式(在清单中)说出来.您必须启动一个活动(在清单中设置),然后让此活动根据用户是否登录而决定,或者不是通过Intent启动的第二个活动:

final Class<? extends Activity> activityClass;
if(userIsLoggedOn())
    activityClass = LoggedOnActivity.class;
else
    activityClass = LogInActivity.class;

Intent newActivity = new Intent(context, activityClass);
context.startActivity(newActivity);
Run Code Online (Sandbox Code Playgroud)

  • 需要注意的一点是,可以在不显示UI的情况下启动活动,因此您可以看到它正在执行您想要的操作...请注意,您的逻辑应该相当快地完成,因此它不是很明显给用户.只需将以下代码放入您的活动清单中:android:theme ="@ android:style/Theme.NoDisplay" (55认同)
  • 这是否与层次结构混乱?即,用户可以按后退按钮并结束此活动吗? (3认同)

Ali*_*.DM 7

使用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>
    
    Run Code Online (Sandbox Code Playgroud)

    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);
    
    Run Code Online (Sandbox Code Playgroud)

之后,应用程序将被杀死一次,下次启动应用程序时,MainActivity将成为启动器.