源码原理知识点

安卓实现IPC(二)—— Intent

2020-02-11  本文已影响0人  笑对浮华

上一篇文章(安卓实现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。

安卓实现IPC(三)—— AIDL

上一篇下一篇

猜你喜欢

热点阅读