同一意图的显式和隐式形式

时间:2017-10-29 21:31:15

标签: java android

相同的自定义意图如何以显式和隐式的形式显示?通过" custom"我的意思是它不是ACTION_VIEW或类似的东西。它用于在同一个应用程序中从另一个(activB)打开一个活动(例如称为activA)并将一些结果(几个boolean vars)返回到第一个活动(activA)。一个人如何能够实现这一点?

1 个答案:

答案 0 :(得分:3)

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

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);

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

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

有关详细信息,请查看herethere

如果您想通过手机中的其他应用发送文字,可以使用显式意图 ShareCompat 类(由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使用显式和隐式意图。但是,如果您想使用其他应用程序中的活动,则必须使用隐式意图。在您的应用内部,最好使用明确的意图来启动活动。使用隐式意图的想法是重复使用手机中其他应用的某些活动。当您遵循标准动作名称时,可以轻松使用某些功能,而且最有趣的是您可以有多种选择。通过对您的活动使用自定义操作,您可以限制您的应用,因为没有人知道此自定义操作,例如在此示例中:&#34; tj.xona.customaction&#34;。