从另一个应用启动外部“隐形”应用

时间:2014-11-06 12:59:30

标签: android intentfilter android-package-managers external-application

我创建了一些没有图标的小应用程序,用户无法直接在Android的应用程序菜单中启动这些应用程序。为此,我删除了应用程序的intent-filter部分:

<intent-filter>
       <action android:name="android.intent.action.MAIN" />
       <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>

现在,我想从一个大的应用程序启动这些小应用程序(我有一个listView列出所有的小应用程序)。当用户单击其中一个应用程序时,我会启动相应应用程序的活动。但是,当我使用小应用程序的packageName执行此操作时,没有任何事情发生。

我真的希望通过拥有许多对用户不可见的小应用程序来保持这种模块化,并且只能从一个大应用程序启动它。

如果可能,我该怎么做呢?

由于

public class MainActivity extends ListActivity {

 /**
 * This class describes an individual SoftFunction (the function title, and the activity class that
 * demonstrates this function).
 */
private class SoftFunction {
    private CharSequence title;
    private String packageName;

    public SoftFunction(int titleResId, int appPackageResId) {
        this.title = getResources().getString(titleResId);
        this.packageName = getResources().getString(appPackageResId);
    }

    @Override
    public String toString() {
        return title.toString();
    }
}
    /**
     * The collection of all Soft Functions in the app. This gets instantiated in {@link
     * #onCreate(android.os.Bundle)} because the {@link Sample} constructor needs access to {@link
     * android.content.res.Resources}.
     */
private static SoftFunction[] mSoftFunctions;

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    // Instantiate the list of samples.
    mSoftFunctions = new SoftFunction[]{
            new SoftFunction(R.string.title_app_test1, R.string.app_test1_package_name),
            new SoftFunction(R.string.title_app_test2, R.string.app_test2_package_name),
            new SoftFunction(R.string.title_app_test3, R.string.app_test3_package_name),
            new SoftFunction(R.string.title_app_test4, R.string.app_test4_package_name),
    };

    setListAdapter(new ArrayAdapter<SoftFunction>(this,
            android.R.layout.simple_list_item_1,
            android.R.id.text1,
            mSoftFunctions));
}

    @Override
    protected void onListItemClick(ListView listView, View view, int position, long id) {
        // Launch the sample associated with this list position.
        Intent i = getPackageManager().getLaunchIntentForPackage(mSoftFunctions[position].packageName);

        if (i != null)
        {
            startActivity(i);
        }
    }

}

1 个答案:

答案 0 :(得分:1)

你必须为你的“小应用程序”活动设置android:exported =“true”。这是因为默认情况下不会导出没有意图过滤器的活动。

像这样:

<activity
    android:name=".YourActivity"
...
    android:exported="true" />

然后,您可以使用包名称和活动名称从外部应用程序启动此活动。

Intent intent=new Intent();
intent.setComponent(new ComponentName("com.your.package.name", "com.your.package.name.YourActivity"));
startActivity(intent);