安卓实现IPC(二)—— Intent
上一篇文章(安卓实现IPC(一)—— IPC概论)提到了安卓实现IPC的四种方式,第一种就是使用Intent来实现,在本篇文章中来学习一下,通过一个demo来演示,加深印象。
老规矩 ,还是先上一个效果演示:
用Intent实现IPC从动画中可以看到,点击按钮后实现了两个应用之间的跳转,从标题栏的应用名称可以区分,在跳转的过程中传递了一个字符串。当然也可以传递自定义类型的数据,不过这个自定义数据类要实现序列化接口。
下面先贴上具体代码,从代码来看怎么用intent实现ipc:
AndroidIPC_Demo代码:
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private Button intentBtn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
}
private void initView() {
intentBtn = findViewById(R.id.btn_intent);
intentBtn.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.btn_intent:
//用intent的隐式启动实现跨进程
Intent intent = new Intent();
//第一种方法 设置action 这种方法在需要启动的activity注册时也要设置对应的action
// intent.setAction("com.example.computer_ren.otherapplication");
// intent.addCategory(Intent.CATEGORY_LAUNCHER);
//第二种方法 使用ComponentName 这样不需要设置action 声明需要开启 的activity所在的包名和类名(全程 带包名)
ComponentName componentName = new ComponentName("com.example.computer_ren.otherapplication",
"com.example.computer_ren.otherapplication.IntentActivity");
intent.setComponent(componentName);
intent.putExtra("data","你好,我是另一个应用的数据。");
startActivity(intent);
break;
}
}
}
上面是启动端的代码,使用intent的隐式启动实现跨进程,其中有两种方法来启动:
1、设置action,这种方法需要被启动的activity在注册时也生命对应的action;
2、用ComponentName这个类来声明需要启动的activity所在的包名和类名全称。
上面的方法就能在一个应用中启动另一个应用的某一个页面了,如果你还想传递一些数据的话,那么直接调用intent提供的方法putExtra()
就可以将数据放到intent的对象中,最后调用方法startActivity()
就可以打开了。
下面贴出被启动端的代码,看看是怎么拿到数据的:
OtherApplication:
public class IntentActivity extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_intent);
TextView textView = findViewById(R.id.show_message_tv);
Intent intent = getIntent();
if (intent != null) {
textView.setText(intent.getStringExtra("data"));
}
}
}
从代码可以看到,在被启动端通过getIntent()
方法拿到传过来的intent对象,然后根据inetnt提供的方法将数据取出来,这样就实现了两个应用的通信。
以上就是通过intent来实现ipc的整个过程,整体来说还是比较简单,用intent的隐式启动来实现的,但在这里有个需要注意的地方,IntentActivity注册的时候需要加上属性android:exported
,即:
<activity android:name=".IntentActivity"
android:exported="true"/>
否则,会报错java.lang.SecurityException: Permission Denial: starting Intent { cmp=com.example.computer_ren.otherapplication/.IntentActivity (has extras) } from ProcessRecord{6d45b40 30424:com.example.computer_ren.androidipc_demo/u0a90} (pid=30424, uid=10090) not exported from uid 10091
.
好了,以上就是对安卓实现IPC的第一种方式——Intent的学习,下面是对第二种方式的学习,用AIDL实现IPC。