先导理解部分
Android系统中,使用显式intent,用户需要指定启动的activity类,操作系统才能负责启动他,而在隐式intent,只要用户描述要完成的任务,操作系统就能自动的找到合适的应用,并在其中启动相应的activity。
显式intent实例
Intent intent = new Intent(getActivity(),CrimePagerActivity.class);
intent.putExtra(EXTRA_CRIME_ID,crimeId);
startActivity(intent);
隐式intent主要组成部分
通常以Intent类中的常量来表示。例如,要访问某个URL,可以使用Intent.ACTION_VIEW;要发送邮件,可以使用Intent.ACTION_SEND。
(2).待访问数据的位置
这可能是设备以外的资源如某个网页的URL,也可能是指向某个文件的URL,或者是指向ContentProvider中某条记录的某个内容URL(content URL)。
(3).操作涉及的数据类型
这指的是MIME形式的数据类型,如text/html或audio/mpeg3.如果一个intent包含数据位置,那么通常可以从中推测出数据的类型。
(4).可选类别
操作用于描述具体要做什么,而类别通常用来描述你打算何时、何地或者如何使用某个activity。例如,Android的android.intent.category.LAUNCHER类别表明,activity应该显示在顶级应用启动器中,而android.intent.category.INFO类别表明,虽然activity向用户显示了包含信息,但它不应该出现在启动器中。
隐式Intent实例
发送一段文本信息,隐式intent的操作是ACTION_SEND。不指向任何数据,也不包含任何类别,但会指定数据类型是text/plain
private Crime mCrime;
private EditText mTitleField;
private Button mDateButton;
private CheckBox mSolvedCheckbox;
private Button mReportButton;
...
public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState){
...
mReportButton = (Button)v.findViewById(R.id.crime_report);
mReportButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent i = new Intent(Intent.ACTION_SEND);
i.setType("text/plain");
i.putExtra(Intent.EXTRA_TEXT,getCrimeReport());
i.putExtra(Intent.EXTRA_SUBJECT,getString(R.string.crime_report_subject));
startActivity(i);
}
});
return v;
}
隐式Intent几个存在的问题
1.由于Activity可能被别的应用系统应用,所以需要注意命名上的问题,防止应用程序之间相互影响。
2.在用一个Activity处理多个Action的情况下,可能出现处理不当的情况。
3.对于一个Action字符串,可能出现找到一个Activity,多个Activity,一个都没有处理的情况发生。
1).一个Activity 可以使用
2).多个Activity,系统需要提示哪一个Activity打开
3).一个都没有,则需要提示报错