为什么我无法使用包名访问我的活动?

时间:2016-07-27 08:06:57

标签: android android-intent

我有一个应用A和一个应用B,我试图从应用A打开应用B活动,这不是主要活动。

我知道在这个问题上已经有很多答案了,但我无法做出任何这些工作,这就是我寻求帮助的原因。

首先是"简化"应用程序B的清单(必须打开的那个):

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.rlaville.gestionsav" >

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".Vues.CreationSav"
            android:windowSoftInputMode="stateHidden"
            android:noHistory="true">

        </activity>
        <activity android:name=".Vues.GestionSav" android:noHistory="true" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name=".Vues.StatSav" android:noHistory="true">

        </activity>
        <activity android:name=".Vues.ModifierSav" android:noHistory="true" android:windowSoftInputMode="stateHidden" android:exported="true" >
            <action android:name="com.example.rlaville.gestionsav.MODIFY_ACTIVITY" />
            <category android:name="android.intent.category.DEFAULT" />
        </activity>


        <provider
            android:name=".Donnees.SavDataProvider"
            android:authorities="com.example.rlaville.gestionsav.Donnees.SavDataProvider"
            android:exported="true"
            ></provider>

    </application>

</manifest>

我想要打开的活动是ModifierSav,所以我确实在其中放置了一个intent过滤器,就像在每个教程中所做的那样。

然后我在其他应用中尝试了这些方法:

直接调用意图过滤器名称:

   Intent i = new Intent("com.example.rlaville.gestionsav.MODIFY_ACTIVITY");
   i.putExtra("CurrentSavID", itemId);
   startActivity(i);

或使用packageManager:

public boolean openSavApp(Context ctx, String packageName, long itemId){
    PackageManager manager = ctx.getPackageManager();
    Intent i = manager.getLaunchIntentForPackage(packageName);
    if (i == null) {
        return false;
        //throw new PackageManager.NameNotFoundException();
    }
    i.putExtra("CurrentSavID", itemId);
    ctx.startActivity(i);
    return true;
}

我试图像这样打电话

openSavApp(getActivity(), "com.example.rlaville.gestionsav.MODIFY_ACTIVITY", itemId);

我做错了什么?如何才能从其他应用中打开此特定活动?

2 个答案:

答案 0 :(得分:3)

您错过了<intent-filter>代码。

<activity android:name=".Vues.ModifierSav" android:noHistory="true" android:windowSoftInputMode="stateHidden" android:exported="true" >
            <action android:name="com.example.rlaville.gestionsav.MODIFY_ACTIVITY" />
            <category android:name="android.intent.category.DEFAULT" />
        </activity>

将此更改为

<activity android:name=".Vues.ModifierSav" android:noHistory="true" android:windowSoftInputMode="stateHidden" android:exported="true" >
 <intent-filter>
     <action android:name="com.example.rlaville.gestionsav.MODIFY_ACTIVITY" />
     <category android:name="android.intent.category.DEFAULT" />
 </intent-filter>
</activity>

<强>更新

由于您未在此处提供正确的软件包名称,因此您将获得null意图。

您在此处提供了您在清单标记中提到的此包名称。

<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.rlaville.gestionsav" >

public boolean openSavApp(Context ctx, String packageName, long itemId){
    PackageManager manager = ctx.getPackageManager();
    Intent i = manager.getLaunchIntentForPackage(packageName);
    if (i == null) {
        return false;
        //throw new PackageManager.NameNotFoundException();
    }
    i.putExtra("CurrentSavID", itemId);
    ctx.startActivity(i);
    return true;
}

答案 1 :(得分:2)

    <intent-filter>
        <action android:name="com.example.rlaville.gestionsav.MODIFY_ACTIVITY" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>

您忘记将操作和类别放在intent-filter块中。