使用应用程序选择界面选择启动活动的不同方式

时间:2016-10-28 17:09:46

标签: android android-intent

我想使用应用选择界面来更改活动中的起始值。我所指的应用程序选择界面是当您有多个应用程序捕获相同类型的意图时弹出的应用程序选择界面,并允许用户选择一个以及始终使用该选择。

当前有问题的活动会显示一个按钮,用于选择两个选项,根据该选项构建一个意图,触发意图并退出。而已。我想使用上面提到的界面来显示选项,而不是自定义构建的按钮,因为大多数界面将保留用户选择的语言。理想情况下,这将用于在Activity的类中设置一个值。这两个选项需要有不同的名称,在本例中为term / xterm。

有没有办法实现这个目标?

    final Intent intent = getLaunchIntent();

    //Would like to replace this Alert Dialog with the app selection interface
    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setMessage(R.string.launch_preference);
    builder.setPositiveButton(R.string.term_preference, new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            intent.putExtra("launchType", "launchTerm");
            dialog.dismiss();
            startActivity(intent);
            finish();
        }
    });
    builder.setNegativeButton(R.string.xterm_preference, new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            intent.putExtra("launchType", "launchXTerm");
            dialog.dismiss();
            startActivity(intent);
            finish();
        }
    });
    builder.create().show();
    builder.create().dismiss();

2 个答案:

答案 0 :(得分:1)

警告:部分答案(请查看底部)

当您有多种方法可以对意图做出反应时,您所参考的应用选择界面即会显示。 所以我想你的应用程序应该为同一个意图声明2个不同的定义。

我们的想法是为此创建2个活动(让我们称之为“ReactActivity1”和“ReactActivity2”),这将使用不同的参数启动您的第三个活动

<强>的AndroidManifest.xml

<activity android:name=".ReactActivity1" >
        <intent-filter>
            <action android:name="android.intent.action.VIEW" />

            <category android:name="android.intent.category.DEFAULT" />

            <data android:scheme="(insert a scheme here)" />
            (...)
        </intent-filter>
</activity>
<activity android:name=".ReactActivity2" >
        <intent-filter>
            <action android:name="android.intent.action.VIEW" />

            <category android:name="android.intent.category.DEFAULT" />

            <data android:scheme="(insert a scheme here)" />
            (...)
        </intent-filter>
</activity>

<强> ReactActivity1

(...)
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
Intent intent = getLaunchIntent();
    intent.putExtra("launchType", "launchTerm");
    startActivity(intent);
    finish(); // Running finish() inside onCreate() method will make this activity 
              // "invisible" (it will never be shown to the user, and will
              // immediatly be replaced by the next one...)
}

<强> ReactActivity2

(...)
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
Intent intent = getLaunchIntent();
    intent.putExtra("launchType", "launchXTerm");
    startActivity(intent);
    finish();
}

问题:问题在于我不确定是否可以使两个选项看起来不同(使用不同的名称,如“Term”/“XTerm”)。我认为Android系统会在两种情况下都显示应用程序的名称。

答案 1 :(得分:0)

我通过以下方式取得了成功:

如果创建我的主要活动的意图来自启动,我发送一个自定义意图,该意图由应用程序中的其他两个活动捕获。这允许在两者之间进行选择。可以通过在android:label开头放置intent-filter元素来设置显示的文本。

然后,每个活动都会向主活动发送一个意图,并使用额外的确定启动类型,并且执行可以正常继续。

    <activity android:name=".Activity1" >
        <intent-filter android:label="text to be displayed in selection" >
            <action android:name="SELECTION_INTENT" />
            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
    </activity>

    <activity android:name=".Activity2" >
        <intent-filter android:label="text to be displayed in selection" >
            <action android:name="SELECTION_INTENT" />
            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
    </activity>

    <activity android:name="MainActivity" >
        <intent-filter>
            <action android:name="CHOICE_INTENT" />
            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
    </activity>