【问题标题】:Explicit and implicit form of the same intent同一意图的显式和隐式形式
【发布时间】:2017-10-29 21:31:15
【问题描述】:

相同的自定义意图会以显式和隐式的形式出现吗? “自定义”是指它不是ACTION_VIEW 或类似的东西。它旨在用于在同一个应用程序中从另一个 (activA) 打开一个活动(例如称为 activB),并将一些结果(几个 boolean 变量)返回到第一个活动 (activA)。一个人将如何实现这一点?

【问题讨论】:

  • developer.android.com/guide/components/… 隐式 Intent 与系统共享以接收 ACTIONS,因此您可以通过声明另一个已安装应用程序的相同过滤器来从您的应用程序中显示一个选择对话框。来自文档:警告:为避免无意中运行不同应用的服务,请始终使用显式意图来启动您自己的服务,并且不要为您的服务声明意图过滤器。
  • @MarcosVasconcelos 但关于活动而非服务的问题。并且已经建议了该链接)))
  • 链接指向带有意图过滤器的活动
  • 因为你问:new Intent("tj.xona.customintent.SecondActivity"); // 隐式意图 这是一个带有字符串构造函数的显式意图
  • @jibrahim 不错,现在是正确答案

标签: java android


【解决方案1】:

定义一个整数常量,例如:

private static final int REQUEST_CODE = 1;

在你的 Activity 类中创建一个新的 Intent:

Intent intent = new Intent(this, DestinationActivity.class);
startActivityForResult(intent, REQUEST_CODE);

在这个 Activity 类中重写以下方法:

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == REQUEST_CODE && resultCode == RESULT_OK) {
        // do something
    }
}

在您的目标 Activity 类 DestinationActivity 中,您必须创建一个新的 Intent 来保存数据:

Intent data = new Intent();
data.putExtra("boolean1", true);
data.putExtra("boolean2", false);

要将数据传回源活动,您必须调用以下方法:

setResult(REQUEST_CODE, data); // will call onActivityResult() method

更多信息请查看herethere

如果您想通过手机中的其他应用发送文本,您可以使用 explicit intentShareCompat 类(由 v4 支持库提供)。 ShareCompat 示例:

Intent shareIntent = ShareCompat.IntentBuilder.from(this)
                    .setType("text/plain")
                    .setSubject("ShareCompat")
                    .setText("I am using ShareCompat class")
                    .setChooserTitle("Sending Text")
                    .createChooserIntent();

if (shareIntent.resolveActivity(getPackageManager()) != null)
    startActivity(shareIntent);

显式和隐式意图示例:

1) 清单文件:

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

<activity android:name=".SecondActivity">
    <intent-filter>
        <action android:name="tj.xona.customaction" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>

2) MainActivity 类:

public class MainActivity extends AppCompatActivity {

    private TextView textView;
    private Button button;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        textView = (TextView) findViewById(R.id.outputText);
        button = (Button) findViewById(R.id.button);

        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //Intent intent = new Intent(MainActivity.this, SecondActivity.class); // Explicit intent
                Intent intent = new Intent(); // Implicit intent
                intent.setAction("tj.xona.customaction"); // custom action
                startActivityForResult(intent, SecondActivity.CUSTOM_INTENT);
            }
        });
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == SecondActivity.CUSTOM_INTENT && resultCode == RESULT_OK) {
            String msg = data.getStringExtra(SecondActivity.MESSAGE_BACK);
            textView.setText(msg);
        }
    }
}

3) SecondActivity 类:

public class SecondActivity extends AppCompatActivity {

    public static final int CUSTOM_INTENT = 1;
    public static final String MESSAGE_BACK = "message";

    private EditText edit;
    private Button send;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);

        edit = (EditText) findViewById(R.id.edit);
        send = (Button) findViewById(R.id.send);

        send.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String msg = edit.getText().toString();

                Intent intent = new Intent();
                intent.putExtra(MESSAGE_BACK, msg);

                setResult(RESULT_OK, intent);
                finish();
            }
        });
    }
}

结论:您可以在应用中使用intent-filter 定义的Activity 使用显式和隐式intent。但是,如果您想使用来自另一个应用程序的活动,则必须使用隐式意图。在您的应用程序中,最好使用显式意图来启动活动。使用隐式意图的想法是重用手机中其他应用程序的某些活动。当您遵循使某些功能易于使用且最有趣的标准操作名称时,您可以有多种选择。通过对您的活动使用自定义操作,您可以限制您的应用程序,因为没有人知道此自定义操作,例如在此示例中:“tj.xona.customaction”。

【讨论】:

  • 它以隐式意图的形式看起来如何?如何从第一个活动中“抛出”它并使用&lt;intent-filter&gt; 过滤?
  • 你可以找到详细信息here
  • 看看here
  • 如果我需要自定义操作,而不是 ACTION_SEND,该怎么办?如何定义并添加到&lt;intent-filter&gt;
  • 你会在herethere找到这个问题的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-11
  • 2016-07-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多