我正在编写一个应用程序,要求您在使用之前登录服务。根据我对android到目前为止的理解,你必须选择从清单中的启动器打开时要启动的活动。我不知道我想在编译时启动哪个活动。我希望用户单击该图标,然后检查并查看他们是否已登录,然后根据是否启动登录活动或主应用程序活动来决定。有没有办法做到这一点?
答案 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还有另一种方法可以做到这一点。
在清单中:
<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将成为启动器。
答案 2 :(得分:1)
Android Framewowrk提供了方法
public Intent setClassName (String packageName, String className)
仅使用String中的类名称来动态选择要调用的活动。
这是一个例子
String packageName = getPackageName(), className=packageName+"subFolder.myActivity";
Intent i = new Intent();
i.setClassName(packageName, className);
startActivity(i);
答案 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。