针对特定包的自定义意图

Vij*_*jai 6 android android-manifest android-intent

假设我的应用程序是"A",我使用应用程序"A"中的自定义意图启动应用程序"B"的活动.它可以正常工作,因为我想要它.我使用的代码是app"B"的清单:

<activity
        android:name=".mysecondAct"
        android:label="@string/title_activity_second" >
        <intent-filter>
            <action android:name="com.example.intent.action.Dream" />
            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
    </activity>
Run Code Online (Sandbox Code Playgroud)

在应用程序"A"的活动中,我启动应用程序"B",

Intent i =new Intent("com.example.intent.action.Dream");
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(i);
Run Code Online (Sandbox Code Playgroud)

现在,如何指定应将意图发送到的特定包,以便只有该应用程序接收意图并启动活动?原因是,我有一个包列表,用户选择要调用哪一个.

Unc*_*ion 8

使用如下所示的ComponentName类:

Intent intent = new Intent();

intent.setComponent(new ComponentName("com.example1", "com.example1.MyExampleActivity1"));

startActivity(intent);
Run Code Online (Sandbox Code Playgroud)

请注意,第一个参数不是类的包名称; 它是应用程序的包名称---该应用程序的AndroidManifest.xml中清单元素的包属性.

如果您知道要启动的活动的名称(而不是类),那么您可以执行以下操作:

Class<?> claz = null;

if(StringClassname != null) {

    try {

        claz = Class.forName(StringClassname );

    } catch (ClassNotFoundException e) {

        e.printStackTrace();
    }

}

Intent intent = new Intent(this, claz);

startActivity(intent);
Run Code Online (Sandbox Code Playgroud)

并且,如果你甚至不知道活动名称和相应的类,那么我想它成为使用广播的候选者,即从你的AppA,你应该广播..并在AppB,AppC等广播接收器与相应的过滤器..

编辑:鉴于您只知道包名称和意图操作名称,请尝试创建您的意图:

Intent i = new Intent();

i.setAction("com.example.intent.action.Dream");

i.setPackage(packageName);

startActivity(i);
Run Code Online (Sandbox Code Playgroud)


Vij*_*jai 5

所以修复非常简单。我只是将包设置为我的意图应该传递给哪个包。代码是:

Intent i =new Intent("com.example.intent.action.Dream");
i.setPackage("com.package.to.start"); //The package name of the app to which intent is to be sent
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(i);
Run Code Online (Sandbox Code Playgroud)