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

时间:2010-05-05 19:19:45

标签: android android-manifest

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

4 个答案:

答案 0 :(得分: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);

答案 1 :(得分:6)

使用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);
    
  2. 之后,应用程序将被杀死一次,下次启动应用程序时,MainActivity将成为启动器。

答案 2 :(得分:1)

Android Framewowrk提供了方法
public Intent setClassName (String packageName, String className)

您可以使用Intent类的

仅使用String中的类名称来动态选择要调用的活动。

这是一个例子

    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)

答案 3 :(得分:0)

正如上面的@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);
         }

现在,当您首次启动应用时,将启动LauncherActivity,当您退出应用时,再次运行该应用,将启动MainActivity。