Android组件学习系列(一)

来源:互联网 发布:韩国人的生活水平知乎 编辑:程序博客网 时间:2024/06/05 01:03

Android组件学习系列(一)

郭霖《第一行代码》第二版 的学习总结

序言:

众所周知,Android中有四大组件:Activity、BroadcastReceiver、Service和ContentProvider。

Android开发中都是围绕这四大组件来开发。我们的一个App开发,无论使用了何种技术:访问网络、多媒体,数据储存,或者你写了各种各样的类 or JavaBean。你做的一切都是为了得到数据,然后在组件中使用或者呈现。一切都是为组件服务。我们去封装各种类,是让程序具有更好的结构,易懂。

在组件中编程,我们只能重写组件中固定的回调函数(由Android提供)。组件的创建与销毁都是由系统框架控制的,函数的回调也是由系统控制。开发者不能强行干预,更没有办法获取组件的对象。这也决定了,组件之间通信只能用系统支持的Intent。

1、 然而,Intent只能传递基本数据类型和Uri等一些常见的数据类型。Intent只支持传递内置类型和一些限制类型,这就导致了组件之间的数据传递必须都是基本类型。(对象序列化,就可以传递了)
2、由于组件是由系统来控制的。当一个App从被点击,然后启动成为系统的一个进程。在app进程活着的这段时间,app进程中拿到的只是组件的引用,可以理解为:定义了一个变量,该变量指向了某个组件。并不是app自己内部创建组件!

我们都知道,Activity有四种启动模式。所以我们可以去研究两个个比较有意思的事情。

情况一、假设我们有appA和appB两个应用,点击appA打开了一个活动A,然后直接按Home回到手机界面。然后再点击appB,启动另一个活动B。那么请问:此时活动A和活动B是否处于同一个栈中?答案是:不同。

情况二、假设我们有appA和appB两个应用,点击appA打开了一个activityA,然后在activityA中,使用隐式Inten方式启动appB的任何一个activity。那么请问:此时activityA和B的activity是否处于同一个栈中?答案是:同一个栈。

以上两种测试均是在standard模式下,其他模式,大家自己玩去!

2、 正文

首先梳理下我们在安卓中不同组件之间通信有哪些方式,以下分析都是指在同一进程内通信,即单个app中,组件间的通信。如果要实现跨进程的通信,还需要借助Messenger或者AIDL等技术。本文暂时不讲。

2.1、使用Intent 传递 数据

只介绍几种常用的方式,当然,只要你能拿到context,是可以随时随地启动组件。

情况一:Activity 启动 Activity。并向下一个Activity传递数据。
(注意:活动 启动 活动,分 显示隐式 Intent 两种方式,传递数据都是依靠Intent。)

Intent intent = new Intent(FirstActivity.this, SecondActivity.class);intent.putExtra("extra","FirstActivity");startActivity(intent);//使用该方法只可以单向传值。//startActivityForResult(intent,1);//使用该方法可以要求,SecondActivity在结束时,通过设置result,向上一个活动返回数据。  

Context类中,启动Activity的两个方法:
① startActivity(intent); // intent可以是 隐式显示
② startActivityForResult(intent,1);// intent同样可以是 隐式显示

情况二:Activity 启动 service。并向service传递数据。
(启动 service,只有**显示**Intent一种方式,所以在manifest文件清单中,是不会像Activity一样添加action或者category的,即无Intentfilter.传递数据依然都是靠Intent)

Intent intent = new Intent(FirstActivity.this, Service.class);intent.putExtra("extra","010204");startService(intent);//使用该方法只可以单向传值。该方式只会启动服务,之后服务做什么就控制不了。

Context类中,启动service的两个方法:
① startService(intent); // intent只可以用显示,不能像活动一样用Action启动。
② bindService(参数不写了); // intent只可以用显示 ,不能像活动一样用Action启动。
采用bindService方法启动服务,则Activity就可以控制service,但是service依然无法主动向Activity返回数据。

样式一:单应用内部,启动服务组件的标准样式。强烈推荐!


样式二:即可用于单应用内部,启动服务组件,又可以启动另一个APP的 服务组件

情况三:Activity(或service) 中发送 广播 ,向广播接收器发送数据
同样分 显示* 和 *隐式**Intent两种方式,传递数据依然都是靠Intent)

发送广播,同样有两种:

1、有序广播。

2、无序广播。
广播很有用的。有事没事发个广播,可以达到组件间的松耦合。广播的注册有动态和静态两种。

样式一:广播的标准样式,强烈推荐使用。

代码:

样式二:

综上,可以看出,组件间通信都是依赖于Intent来传递数据的。都属于单向通信,即使有数据返回,也比较简单。就像发个通知说:“你可以启动了!”,至于启动后的组件干什么,它就控制不了。

我们希望的是一个进程中,那些正在活动的组件,能不能自由的交流下呢?

0 0