获取当前android.intent.category.LAUNCHER活动的实例(Get inst

2019-08-05 08:58发布

我创建了我跨越几个应用程序共享库项目。 我实现了一个简单的会话过期功能一定时间后会踢用户返回到登录屏幕。

登录屏幕上的活动是我的主要活动,所以在清单中,它看起来是这样的:

<application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/Theme.Sherlock.Light.DarkActionBar"
    android:name="com.blah.application.MyApplication" >
    <activity
        android:name="com.blah.activity.LoginScreenActivity"
        android:label="@string/title_activity_main"
        android:screenOrientation="portrait"
        android:configChanges="orientation|keyboardHidden"
        android:windowSoftInputMode="adjustPan">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>

当会话过期,我想踢用户返回到登录界面,但我不想硬编码活动的名称,因为它可能取决于所使用的库的具体应用有所不同。 这就是我一直在做之前:

Intent intent = new Intent(context, LoginScreenActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
context.startActivity(intent);

如果应用程序的主要活动是东西比LoginScreenActivity不同,这是行不通的。 我不想硬编码“LoginScreenActivity.class”,我想以编程方式确定主类的名称,然后将用户引导到该活动......有人可以帮我吗?

提前致谢!

编辑

我找到了一种方法来完成相同的最终结果,但它绝对不是很大。 由于存在一定量的配置我有必要使用相同的库(字符串,布尔变量等)部署新的应用程序,我添加一个字符串的strings.xml文件中定义的“主”活动名称的具体应用该应用程序:

<string name="mainClassName">com.blah.specificapp.activity.SpecificAppLoginScreenActivity</string>

然后,我可以通过名字得到该类手柄和重定向用户有:

Class<?> clazz = null;

try 
{
    clazz = Class.forName(context.getString(R.string.mainClassName));
} 
catch (ClassNotFoundException e) 
{
    // TODO Auto-generated catch block
    e.printStackTrace();
}

if(clazz != null)
{
    Intent intent = new Intent(context, clazz);
    intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    context.startActivity(intent);
}

我知道这是一个神可怕的解决方案,但它的工作原理。 就像我说的,有配置一定量的,我为每个新的应用程序做,无论如何,所以再添加一个字符串是不是一个巨大的交易,它只是不是很优雅。 谢谢你让我可以完成同样的目标,而无需使用我的劈任何建议。

Answer 1:

您可以从PackageManager请求启动调用 ,使用:

Intent launchIntent = PackageManager.getLaunchIntentForPackage(context.getPackageName());

这将返回你可以用它来启动“主”活动(我以为是你的“登陆”活动)的意图。 只需添加Intent.FLAG_ACTIVITY_CLEAR_TOP到这一点,你应该是好去。



Answer 2:

如何使用你的意图过滤一个MIME类型。

    <activity android:name=".LoginActivity"
              android:exported="true" android:launchMode="singleTop" android:label="@string/MT">
        <intent-filter>
            <category android:name="android.intent.category.DEFAULT"/>
            <action android:name="com.foo.ACTION_LOGIN" />
            <data android:mimeType="application/x.foo.com.mobile.login" /> 
     </intent-filter>
    </activity>

并启动活动如下:

Intent intent = new Intent();
intent.setAction("com.foo.ACTION_LOGIN");
intent.setType("application/x.foo.com.mobile.login");
startActivity(myIntent);

因此,意图将通过任何活性与该动作/ MIME类型对注册被服务。 我不能肯定,但我认为,如果该活动是在同一个应用程序托管,可以首先选择。



文章来源: Get instance of current android.intent.category.LAUNCHER activity