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

获取当前android.intent.category.LAUNCHER活动的实例,android,android-intent,android-manifest,Android,Android Intent,Android Manifest,我创建了一个库项目,我正在多个应用程序中共享该项目。我实现了一个简单的会话过期功能,它会在一段时间后将用户踢回登录屏幕 登录屏幕活动是我的主要活动,因此在清单中看起来如下: <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/Theme.Sherlo

我创建了一个库项目,我正在多个应用程序中共享该项目。我实现了一个简单的会话过期功能,它会在一段时间后将用户踢回登录屏幕

登录屏幕活动是我的主要活动,因此在清单中看起来如下:

<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>
如果应用程序的主要活动与LoginScreenActivity不同,则此操作无效。我不想硬编码“LoginScreenActivity.class”,我想通过编程确定主类的名称,然后将用户指向该活动……有人能帮我吗

提前谢谢

编辑

我找到了一种方法来实现同样的最终结果,但它肯定不是很好。由于使用相同的库(strings、bools等)部署新应用程序需要一定数量的配置,因此我在strings.xml文件中为特定应用程序添加了一个字符串,用于定义该应用程序的“main”活动名称:

<string name="mainClassName">com.blah.specificapp.activity.SpecificAppLoginScreenActivity</string>
com.blah.specificapp.activity.SpecificAppLoginScreenActivity
然后我可以按名称获取该类的句柄,并将用户重定向到该类:

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);
}
Class clazz=null;
尝试
{
clazz=Class.forName(context.getString(R.string.mainClassName));
} 
catch(classnotfounde异常)
{
//TODO自动生成的捕捉块
e、 printStackTrace();
}
if(clazz!=null)
{
意图=新的意图(上下文,clazz);
intent.setFlags(intent.FLAG\u ACTIVITY\u CLEAR\u TOP);
背景。开始触觉(意图);
}

我知道这是一个非常糟糕的解决方案,但它是有效的。正如我所说,我必须为每个新应用程序进行一定量的配置,所以再添加一个字符串并不是什么大问题,只是不是很优雅。如果有任何建议可以在不使用我的hack的情况下实现相同的目标,我将不胜感激。

在您的意图过滤器上使用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>

因此,无论使用此action/mime类型对注册了什么活动,都将为意图提供服务。我不确定,但我认为如果该活动在同一个应用程序中托管,可能会首先选择它。

您可以通过以下方式向PackageManager请求启动意向:

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

这将返回一个意图,您可以使用它来启动“主”活动(我假设它是您的“登录”活动)。只需添加
Intent.FLAG\u ACTIVITY\u CLEAR\u TOP
,您就可以开始了。

每个应用程序可以有多个主要活动……这是事实,但如果我能得到这些活动的列表,那么我可以选择正确的活动。我要查找的类的名称将始终命名为“*LoginsScreenActivity”。这听起来就像对
类进行编码一样糟糕。我同意。我不能硬编码这个类,因为我不知道它的名字。也许我需要一种完全不同的方法…还有其他想法吗?如果您使用的是来自Android 3+的导航元数据或支持库中的等效元数据,您可以在堆栈中查找根活动是什么。我尝试了您的方法,但它引发了一个异常:致命异常:main android.content.ActivityNotFoundException:找不到处理Intent的活动{act=android.Intent.action.main typ=application/com.blah.activity.main}intent.setAction(“android.intent.action.MAIN”);setType(“application/com.blah.activity.main”);我组装了一个示例应用程序,发现了类似的问题。改变启动器活动的意图过滤器破坏了Android启动应用程序的能力。我想这是一个有缺陷的方法。对不起,把你搞错了。大卫,你是个天才。这正是我想要的。刚刚试用过,它的工作方式完全符合我的要求(将用户返回到“主”活动)。谢谢你的帮助!您也可以从活动上下文获取
PackageManager
<代码>getApplication().getPackageManager().getLaunchIntentForPackage(getApplication().getPackageName())
Intent intent = new Intent();
intent.setAction("com.foo.ACTION_LOGIN");
intent.setType("application/x.foo.com.mobile.login");
startActivity(myIntent);
Intent launchIntent = PackageManager.getLaunchIntentForPackage(context.getPackageName());