美文网首页源码原理知识点
安卓实现IPC(二)—— Intent

安卓实现IPC(二)—— Intent

作者: 笑对浮华 | 来源:发表于2020-02-11 15:49 被阅读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

    相关文章

      网友评论

        本文标题:安卓实现IPC(二)—— Intent

        本文链接:https://www.haomeiwen.com/subject/ktrxfhtx.html