我正在编写一个应用程序,要求您在使用之前登录到服务。根据我目前对 android 的理解,当您从清单中的启动器打开时,您必须选择要启动的活动。我不知道我想在编译时启动哪个活动。我希望用户单击该图标,然后检查他们是否已登录,然后根据此决定是启动登录活动还是主应用程序活动。有没有办法做到这一点?
问问题
16381 次
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
还有另一种使用活动别名的方法。
在清单中:
<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);
于 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 回答