我们知道每个app运行在自己独立的进程中,如果进程间要进行通信,直接调用会报安全异常的。但是有时我们必须去和其他app间进行交互,所以google给出了规范。我们学习进程间的通信其实就是了解这个规范。
进程间的通信也是针对android四大主件来的,下面我分别讲解一下activity/broadcast/content provider/service是如何来实现的。
activity的进程通信
- a.同一个进程(应用)
- 没有返回值的
- Intent intent = new Intent(this , Test.class );
startActivity(intent);- 有返回值的
- Intent intent = new Intent(this , Test.class );
- startActivityforresult(intent,requestCode);
- b.其他的进程
- 例如: Intent callIntent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:12345678" );
c.自定义
- startActivity(callIntent);
步骤:
1.在Android manifest.xml文件中指定Action。指定action要使用<action>标签,并在该标签的Android:name属性中指定Action;
2.在Android manifest。xml文件中指定访问协议。在指定Uri(Intent类的第2个参数)时需要访问协议。访问协议需要使 用<data>标签的android:scheme属性来指定。如果该属性的值是“abc”,那么Uri就应该是“abc://Uri的主体 部分”,也就是说,访问协议是Uri的开头部分;
3.通过getIntent().getdata.getHost()方法获得协议后的Uri的主题部分。这个host只是个称为,并不一定是主机名。
4.从Bundle 对象中获得其他应用程序传递过来的数据。
5.获得数据后的处理
下面我们来共享一个Activity。项目名称叫actionactivity
package net.blogjava.mobile.actionactivity;
... ...
public class Main extends Activity implements OnClickListener
{
private EditText editText;
@Override
public void onClick(View view)
{
// 单击按钮,会显示文本框中的内容(以Toast信息框形式显示)
Toast.makeText(this , editText.getText().toString(), Toast.LENGTH_LONG)
.show();
}
@Override
public void onCreate(Bundle savedInstanceState)