我想使用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?
答案 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>