android跨进程通信(一)

1.Activity声明周期(详尽含底层)

Activity A 和 Activity B,A 中存在按钮点击跳转 B,
创建A onCreate(A) -> onStart(A) -> onResume(A),A处于活动可视状态;
点击按钮由A跳转至B,B成为活动界面 onPause(A) -> onCreate(B) -> onStart(B) -> onResume(B) ->onStop(A);
点击back键回到A界面,onPause(B) -> onRestart(A) -> onStart(A) -> onResume(A) ->onStop(B) ->onDestory(B);
点击home键最小化当前页面 onPause() -> onStop(), 重新调起当前页面 onRetart() -> onStart() -> onResume().

2.Android中可以实现进程间的通信有哪些?

android SDK提供了4中跨进程间的通信activity,service,broadcast,ContentProvide,即四大组件。

  • Activity:可以跨进程调用其他程序的Activity;
  • ContentProvider:可以跨进程访问其他应用的数据,以Cursor对象形式访问,同时也可对其他应用的数据进行增删改操作;
  • Broadcast:向安卓系统中所有应用发送广播,需要跨进程通信的应用可以进行监听这些广播;
  • Service:和ContentProvider一样可以访问其他应用程序的数据,但是与ContentProvider返回的结果不同,service返回的是Java对象,此种跨进程间的服务是AIDL服务。

具体的实现过程

一、 activity

跨进程访问与进程内访问不同,跨进程不需要指定Context对象和Activity的class对象,而是指定要访问的Activity所对应的Action(一个字符串)。有些还需要指定一个Uri。
例如:

(1)在应用中拨打电话
Intent intent = new Intent(Intent.ACTION_CALL,Uri.parse("tel: 95533));
startActivity(intent);
(2)在A应用中a界面打开B应用的b界面,B应用中的b界面 BActivity在配置文件中进行如下设置,
 <activity android:name=".BActivity">
        <intent-filter>
            <--自定义动作,一般用包名加类名,类名大写-->
            <action android:name="com.birkhoffchu.cameraapp.BACTIVITY"/>
            <--类型-->
            <category android:name="android.intent.category.DEFAULT"/>
            <--数据-->
            <data android:scheme="zsc"/>
        </intent-filter>
  </activity>

任何一个需要隐式启动的Activity都必须要有此项 ,android.intent.category.MAIN和android.intent.category.LAUNCHER的filter中没有必要加入android.intent.category.DEFAULT,当然加入也没有问题。
如果又两个Activity,它的action相同时,当要启动此页面时,系统会出现选择框供其选则。
例如:

<activity android:name=".Main3Activity">
        <intent-filter>
            <action android:name="com.birkhoffchu.cameraapp.CHI"/>
            <action android:name="com.birkhoffchu.cameraapp.HE"/>
            <category android:name="android.intent.category.DEFAULT"/>
            <data android:scheme="x-id"/>
        </intent-filter>
    </activity>

    <activity android:name=".Main2Activity">
        <intent-filter>
            <action android:name="com.birkhoffchu.cameraapp.CHI"/>
            <category android:name="android.intent.category.DEFAULT"/>
        </intent-filter>
    </activity>

>在MainActivity.java里发送一个intent:

intent.setAction( "com.birkhoffchu.cameraapp.CHI");
//不加下面这行也行,因为intent的这个属性默认值即系Intent.CATEGORY_DEFAULT
intent.addCategory(Intent.CATEGORY_DEFAULT);
startActivity( intent );
此时会弹出选择框提示用户选择,如果category相同,而action不同,则克匹配到,如果将上面改成intent.setAction("com.birkhoffchu.cameraapp.CHI"),则会匹配Main3Activity页面。

单单靠添加addCategory属性不能匹配,如:

Intent intent = new Intent();
intent.addCategory(Intent.CATEGORY_DEFAULT);
intent.addCategory("android.intent.category.hello");
startActivity(intent);

<activity android:name=".MyActivityTwo" android:label="@string/ activityTwo">
    <intent-filter>
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.hello"></category>
    </intent-filter>
</activity>

也可以根据action和data匹配

<activity android:name=".MyActivityTwo" android:label="@string/ activityTwo">
    <intent-filter>
             <action android:name="android.intent.action.leo"></action>
                <category android:name="android.intent.category.DEFAULT"></category>
                <data android:scheme="x-id"></data>
    </intent-filter>
</activity>



//Uri uri = Uri.parse("x-id://www.google.com/getDetails?id=123");//这个也可以
//Uri uri = Uri.parse("x-id");//这个不行
//Uri uri = Uri.parse("x-id://");这个可以
Uri uri = Uri.parse("x-id:");//这个可以

 Intent in = new Intent();
 in.setAction("android.intent.action.leo");//去掉这行不行,单靠data不能匹配
 in.addCategory(Intent.CATEGORY_DEFAULT);//可以去掉这行,因为intent的默认category值即系Intent.CATEGORY_DEFAULT
 in.setData(uri);//去掉这行不行
 startActivity(in);

可以通过intent.putExtra(name,value)传递数据,也可以在返回页面重写onActivity()方法获取返回值

Intent intent = new Intent();
intent.setAction("com.birkhoffchu.cameraapp.CHI");
Bundle bundle = new Bundle();
bundle.putString("msg","吃吃吃");
intent.putExtra("bundle",bundle);
startActivity(intent);

protected void onActivityResult(int requestCode, int resultCode,Intent data){  
    Toast.makeText(this, "返回值:" + data.getExtras().getString("result"),  
       Toast.LENGTH_LONG).show();  
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值