54

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

4

4 回答 4

67

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

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

Intent newActivity = new Intent(context, activityClass);
context.startActivity(newActivity);
于 2010-05-05T19:29:29.727 回答
7

还有另一种使用活动别名的方法。

  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 将成为启动器。

于 2016-04-16T20:28:34.130 回答
1

Android Framework 提供了方法
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)

于 2019-06-05T06:30:49.250 回答
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。

于 2017-07-29T09:53:01.420 回答