zoukankan      html  css  js  c++  java
  • Android随笔之——跨进程通信(一) Activity篇

      在Android应用开发中,我们会碰到跨进程通信的情况,例如:你用QQ通讯录打电话的时候会调用系统的拨号应用、某些新闻客户端可以将新闻分享到QQ、微信等应用,这些都是跨进程通信的情况。简而言之,就是一个应用调用了另一个应用,并传递了一定的数据。在Android中有Activity、Content Provider、BroadcastReceiver、Service四大组件,巧的是Android进程间通信也离不开这四大组件(也有说是AIDL机制,但是现在还分不清Service和AIDL的区别(/ □ ) ),组件间通信的核心机制是Intent,通过Intent可以开启一个Activity或者Service。

      对于这四大组件,最常用也是最容易理解的就是Activity了,因为Activity是看得见摸得到的,所以跨进程通信也就先从Activity先讲起来。

      Activity既可以在同一个进程内访问,也可以跨进程访问,是否跨进程访问的主要区别在于Intent是显示Intent还是隐式Intent。

      Intent类型:

      1、显示Intent——直接指定要启动的Activity类,一般用于同一个进程内的不同组件间通信,其格式为new Intent(this,Target.class);

    //显示Intent,一般用于启动同一进程中的Activity
    Intent intent = new Intent(this,OtherActivity.class);
    startActivity(intent);

      2、隐式Intent——一般用于跨进程通信,注册在AndroidManifest.xml文件中,其格式为intent.setAction(String action)。

    // 隐式Intent
    Intent intent = new Intent();
    // 设置Action,启动系统拨号界面,ACTION_CALL其实是字符串常量"android.intent.action.CALL"
    intent.setAction(Intent.ACTION_CALL);
    startActivity(intent);

      既然知道了Activity间跨进程通信的主要取决于隐式Intent,那么,我们该如何实现隐式Intent呢?答案是正如上面所说,在AndroidManifest.xml文件中注册就行了。下面就又到了直接上代码的环节,代码注释中会穿插一些要注意内容。

      创建一个OtherActivity的Android项目,将布局文件稍稍修改下:

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:paddingBottom="@dimen/activity_vertical_margin"
        android:paddingLeft="@dimen/activity_horizontal_margin"
        android:paddingRight="@dimen/activity_horizontal_margin"
        android:paddingTop="@dimen/activity_vertical_margin"
        tools:context=".MainActivity" >
    
        <!-- 实际开发中不建议将内容直接写在text内 -->
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="我是被另一个Activity跨进程召唤的" />
    
    </RelativeLayout>

      接着,修改OtherActivity项目的AndroidManifest.xml文件:

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.lsj.otheractivity"
        android:versionCode="1"
        android:versionName="1.0" >
    
        <uses-sdk
            android:minSdkVersion="8"
            android:targetSdkVersion="19" />
    
        <application
            android:allowBackup="true"
            android:icon="@drawable/ic_launcher"
            android:label="@string/app_name"
            android:theme="@style/AppTheme" >
    
            <!-- 一个<activity>包括:零个或多个<intent-filter> -->
            <!-- 它主要是作为匹配的标准,能否匹配成功由<action>、<category>、<data>三个tag共同决定的。 -->
            <activity
                android:name="com.lsj.otheractivity.MainActivity"
                android:label="@string/app_name" >
    
                <!-- 一个<intent-filter>包括:一个或多个<action> 零个或多个<category> 零个或一个<data> -->
                <intent-filter>
    
                    <!-- <action>是实现隐式Intent启动另一进程中的Activity的关键 -->
                    <!-- 想要启动这个这个Activity,只要往setAction中添加此处<action>标签中的字符串常量即可 -->
                    <action android:name="com.lsj.otherActivity" />
                    <!-- 如果有自定义action时,记得添加下面这句 ,不然会报错-->
                    <category android:name="android.intent.category.DEFAULT" />
    
                    <action android:name="android.intent.action.MAIN" />
    
                    <!-- <category>用于指定Activity的分类特征,此处代表此Activity是这个程序的启动界面 -->
                    <category android:name="android.intent.category.LAUNCHER" />
    
                    <!-- <data>标签不会用,暂时忽略 -->
                </intent-filter>
            </activity>
        </application>
    
    </manifest>

      接着,在创建一个Activity的Android项目,在其MainActivity中添加如下代码:

    // 新建一个Intent对象
    Intent intent = new Intent();
    // 设置Intent对象的Action,Action为OtherActivity配置文件中注册的action值
    intent.setAction("com.lsj.otherActivity");
    // 启动Activity
    startActivity(intent);

      先安装好OtherActivity,然后安装并运行Activity,你会发现OtherActivity已经被打开了。这就实现了Activity间跨进程通信,对于传递数据,可以用bundle或者intent。putExtras()来实现。

      对于前面讲到的设置action可能会有这么个疑惑,如果一个Intent对应多种匹配结果该怎么处理呢?系统会根据组件的不同而不同对待,如果是service那么这些service都可以启动并处理消息;如果是Activity则会弹出一个对话框让用户进行选择。

    参考:android多进程通信

    作者:登天路

    转载请说明出处:http://www.cnblogs.com/travellife/

  • 相关阅读:
    把sqlserver2000的备份文件恢复到sqlserver2008中
    application、static、Session、ViewState 的区别
    命令行安装卸载服务(安装卸载.net写的服务)
    C# Windows服务自动安装与注册
    C# System.Guid.NewGuid()
    <base target="_self"/>
    C#写的windows服务,在启动时提示“服务启动后又停止了,一些服务自动停止”
    MVC中validateRequest="false"不起作用
    PL/SQL导出insert语句
    MO和MT
  • 原文地址:https://www.cnblogs.com/travellife/p/4111977.html
Copyright © 2011-2022 走看看