Android——四大组件及其通信方式

1. Android中的四大组件

(1) Activiey:可以说是android中最重要的组件了,每一个android中都会有大量的Activity,其中有一个main activity是初次运行时进入的界面。activity是用户交互的组件,可以是一个全屏的,也可能是一个浮在其他窗口之上的一个小的窗口

(2) Service:后台服务的组件,例如后台进行的服务器数据拉取,查询系统更新等等。Service可以分为两种:

一种是本地服务,比如说查询升级信息等

另一种是远程服务,比如说查询天气预报等等

(3) ContentProvider:内容提供者。每一个android应用程序都有自己的一个ID,也是自己独立的一个进程,这样可以保护系统及其应用程序,避免受其他应用程序的影响。而provider是不同应用程序之间共享数据的唯一途径。获取其他应用的数据信息需要获取相应的权限,在AndroidManifest.xml中定义。自己也可以创建自己应用的provider来供其它程序来使用。

(4) BroadcastReceiver:广播接收器。接收广播通知信息,每个应用程序都可以拥有任意数量的广播接收器来对自己感兴趣的广播进行处理。广播接收器没有用户界面,可以通过启动一个activity来处理接收到的信息,或者通过用NotificationManager来通知用户。

四大组件中,前三个组件必须在AndroidManifest.xml中来进行定义,而广播接收器可以在AndroidManifest.xml中定义(静态注册,必须继承BroadcastReceiver),也可以在代码中进行注册(动态注册,使用Context.registerReceiver注册,使用Context.sendBroadcast来发送)。 
 
2. Activity的生命周期
 
 
3. Service生命周期
Service比较简单,仅仅有三个方法
(1) onCreate(): 第一次启动时调用
(2) onStart(): 第一次启动时调用
(3) onDestory(): 停止时调用
如果service已经启动,再次调用时只会调用onStart()方法,也就是说onCreate()只会被调用一次
 
4. ContentProvider
(1) 为存储和获取数据提供统一的接口
(2) 主要是默认所有的数据来源都是一张表,通过查询来获取数据 (query, insert, update, delete, getType, onCreate)
(3) Android内置的很多数据(视频,图像,通讯录等)都是通过ContentProvider来供开发者调用的
 
5. BroadcastReceiver
(1) Android系统运行中的很多事件,都会通过广播的形式发出去。比如收发信息,拨打电话,屏幕解锁等。
(2) 应用程序根据自己的需要接收相应的广播信息
(3) BroadcastReceiver的生命周期,从对象调用它开始,到onReceiver方法执行完成之后结束。
(4) 每次广播被接收后会重新创建BroadcastReceiver对象,并在onReceiver方法中执行完就销毁,如果BroadcastReceiver的onReceiver方法中不能在10秒内执行完成,Android会出现ANR异常。
(5) 如果需要在BroadcastReceiver中执行耗时的操作,可以通过Intent启动Service来完成。但不能绑定Service
 
Intent是Android四大组件之间通信的纽带,在Intent中携带数据也是四大组件之间数据通信最常用、最普通的方式。
然而出了Intent之外,其实还有些其他的方式也可以帮助来进行通信
 
6. Activity与Activity之间的通信方式
 (1) Intent携带数据进行消息传递(主流方式)
    private class nextClickListener implements View.OnClickListener
    {
        public void onClick(View v) {
            // TODO Auto-generated method stub
            /*
            Bundle bundle = new Bundle();
            bundle.putString("name","zhangsan");
            bundle.putInt("age",23);
            Intent intent = new Intent(MainActivity.this,SecondActivity.class);
            intent.putExtras(bundle);
            startActivity(intent);
            */

            Intent intent = new Intent(MainActivity.this,SecondActivity.class);
            intent.putExtra("name","zhangsan");
            intent.putExtra("age",33);
            startActivity(intent);
        }
    }

Intent有两种信息传递方式,一种是通过Bundle来进行传递,Bundle:A mapping from String values to various Parcelable types

或者直接通过key-value来进行传递

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.second);
        tv = (TextView)findViewById(R.id.resultView);
        back = (Button)findViewById(R.id.back);
        back.setOnClickListener(new backClickListener());

        Intent intent = getIntent();
        String name = intent.getStringExtra("name");
        int age = intent.getIntExtra("age",0);
        tv.append(name+age);

    }

在第二个activity中可以直接通过getIntent()来获取到相关的数据,依旧可以用key-value来获取。

(2)  可以通过类的Static 成员变量来进行传递,比如在secondActivity中定义一个static 成员变量,然后再firstActivity进行更改

(3) 当然可以通过单独的一个类设置一些静态成员变量来传递消息,这样的话两个类都是可以随时访问的

(4) 可以使用sharedPreferences来实现数据存储和通信,sharedPreferences是一种轻型的数据存储方式,本质是基于XML文件存储的key-value对,通常是存储一些简单的配置信息。可以在firstActivity中存储一些数据到sharedPreferences文件中,然后再SecondActivity中进行访问(文件名要注意相同)。不过采用SharedPreference只能存取标准数据类型的变量值int、float、long、boolean、String。
根据Context获取SharedPreferences对象
利用edit()方法获取Editor对象。
通过Editor对象存储key-value键值对数据。
通过commit()方法提交数据。
(5) 当然通过其他存储方式也是可以的,例如Android提供的SQLite数据库,以及自己定义的文件
(6) 通过Service来协助通信,不过这样的话Service就有些大才小用了,而且Service组件随时可能会死掉,还需要自己确保数据的永久化。
 
 
 7. Activity与Service之间的IPC通信
(1) 可以直接通过Intent来进行简单地信息传递,但是传递值比较不方便,性能不是很高
(2) 绑定服务的时候,Activity要实现ServiceConnection类。之后可以重写方法onServiceConnected 和 onServiceDisconnected。其中onServiceConnected(ComponentName componentName, IBinder iBinder) 方法在绑定成功时被调用,第二个参数可以帮助来进行消息传递(代码在service启动方式中有详细介绍)
(3) 通过监听服务中的进程变化来实现
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
posted @ 2017-08-31 10:26  东木刀纹  阅读(1001)  评论(0编辑  收藏  举报