将显式意图更改为隐式意图Android

时间:2018-04-03 12:16:28

标签: java android android-intent

我想使用Implicit Intent实现一些活动。目前,我在此按钮上有一个带有“显示国家/地区”标签的按钮。单击此按钮后,将触发子活动,并将国家/地区列表显示为ListView。当我选择某个国家/地区时,我会返回主要活动,其中所选国家/地区名称显示在TextView和Toast小部件中。我能够使用显式活动来实现这些操作,但是,我不知道如何使用隐式活动。特别是,我不确定在创建新的Intent实例时要设置哪些参数。

以下是Child Activity代码:

public class ChildActivity extends AppCompatActivity {
    ListView lvActionMode;
    TextView textView;
    Toast toast;
    String selectedItem;

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

        ArrayAdapter<String> adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1,
                getResources().getStringArray(R.array.items));
        lvActionMode = findViewById(R.id.lvActionMode);
        lvActionMode.setAdapter(adapter);
        lvActionMode.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL ???); 
        lvActionMode.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) {
                selectedItem = (String) adapterView.getItemAtPosition(position);
                Intent replyIntent = new Intent(ChildActivity.this, MainActivity.class);
                replyIntent.putExtra("selectedItem", selectedItem);
                setResult(RESULT_OK, replyIntent);
                startActivity(replyIntent);
            }
        });
    }
}

这是主要的一个:

public class MainActivity extends AppCompatActivity {
    TextView textView;
    Toast toast;
    Intent intent;

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

        textView = findViewById(R.id.textView);
        Context context = getApplicationContext();
        int duration = Toast.LENGTH_SHORT;
        toast = Toast.makeText(context, "popup", duration);

        if (getIntent().hasExtra("selectedItem")) {
            textView.setText(getIntent().getStringExtra("selectedItem"));
            toast.setText(getIntent().getStringExtra("selectedItem"));
            toast.show();
        }
    }

    public void sendMessage(View view){
        intent = new Intent(Intent.ACTION_VIEW ???? );
        startActivityForResult(intent, RESULT_OK);
    }
}

那么如何将显式Intent更改为隐式Intent?

2 个答案:

答案 0 :(得分:1)

如果您查看docs,您会看到如果您希望活动响应隐式意图,则需要在清单文件中注册一个意图过滤器,如下图所示。请注意,如果您这样做,您需要创建一个特定于您需求的类别,以便意图不会打开另一个应用程序。

 <intent-filter>
        <action android:name="android.intent.action.VIEW"/>
        <category android:name="android.intent.category.DEFAULT"/>
        <data android:mimeType="text/plain"/>
    </intent-filter>

记住隐式意图如何工作,android会在系统中查找与您在创建意图时设置的操作,类别和数据类型相匹配的活动,因此请确保您的意图对您的活动是唯一的(通过创建自定义例如)。

创建类别非常简单:

static final String CATEGORY_COUNTRY = "com.example.category.COUNTRY";

为避免头痛,请务必检查您的隐含意图是否会解析为实际活动,以免您的应用崩溃:

if (intent.resolveActivity(getPackageManager()) != null) {
    startActivity(intent);
}

答案 1 :(得分:1)

为了让Android操作系统将您的ChildActivity识别为处理要查看的数据的活动,您需要在清单中声明一个意图过滤器。例如: -

<activity android:name=".child_activity_name_here"
      android:label="@string/app_name">
    <intent-filter>
        //Because you are calling Intent.ACTION_VIEW
        <action android:name="android.intent.action.VIEW" /> 
        <category android:name="android.intent.category.DEFAULT" />
        <data android:scheme="text/plain"/> //type of your data you send in the Intent constructor
    </intent-filter>
</activity>