Android四大组件

Android四大组件

Android最基础的知识应该就要从四大组件说起了,不管是新手小白,还是有了多年开发经验的开发者,做到“温故而知新”肯定是不会错的.

1. 活动 Activity

活动,作为四大组件中最基础的组件,是平时与用户打交道最多的. 那么我将从三方面来介绍activity

1.1生命周期

生命周期

  • onCreate( ):Activity正在被创建,做一些初始化的操作
  • onRestart( ):Activity正在重新启动,当前Activity由不可见重新变为可见时被调用
  • onStart( ):Activity正在启动,这时Activity已经可见了,只是没有出现在前台,不能与用户进行交互
  • onResume( ):Activity出现在前台并获取了焦点,可以与用户进行交互了
  • onPause( ):Activity失去焦点,正常情况下onStop( )会接着被调用;不能做耗时的操作,因为只有当前Activity的onPause( )执行完,新开启的Activity的onResume( )才会执行
  • onStop( ):Activity即将停止,:可以做一些稍微重量级的操作,但也不能太耗时
  • onDestroy( ):Activity即将被销毁,做一些回收工作及释放资源的操作
我们来分析不同情况下,Activity的生命周期的执行顺序
正常启动一个Activity:onCreate --> onStart --> onResume
启动一个新的Activity:onPause --> onStop --> onDestroy
启动透明主题的Activity或DialogActivity:onPause
按HOME键切换到桌面或锁屏:onPause --> onStop
再次回到原Activity:onRestart --> onStart --> onResume
返回键关闭Activity:onPause --> onStop --> onDestroy
弹出一个dialog时:不会回调任何生命周期的方法
异常情况下的生命周期
资源相关系统配置发生改变导致Acitivity被杀死并重新创建,屏幕旋转等:onPause,onStop,onDestroy都会被调用,还会调用 onSaveInstanceState() 来保存当前Activity状态,调用时机在onStop之前,与onPause没有既定顺序;Acitivity重新创建后,系统会调用 onRestoreInstanceState (),并把Activity销毁时onSaveInstanceState方法保存的 Bundle对象作为参数同时传递给onRestoreInstanceState和onCreate方法,onRestoreInstanceState的调用时机在onStart之后
系统内存不足导致低优先级的Activity被杀死

1.2 Acitivty与Fragment

碎片(Fragment)是一种可以嵌入在活动中的UI碎片

  • Fragment与Acitivty之间的通信:调用FragmentManager的findFragmentById方法,可以在Activity中获得Fragment的实例;在Fragment中可以调用getActivity( )方法获得Activity的实例
  • Fragment和Fragment之间的通信:现在一个Fragment中获得与它关联的Activity的实例,再通过这个Activity去获取另一个Fragment

Fragment的生命周期

  • onAttach( ):当Fragment与Activity建立关联的时候调用
  • onCreateView( ):为Fragment创建视图(加载布局)时调用
  • onActivityCreated( ):确保与Fragment相关联的Activity已经创建完毕时调用
  • onDestroyView( ):当与Fragment关联的视图被移除时调用
  • onDetach( ):当Fragment与Activity解除关联时调用

Fragment生命周期的执行顺序
onAttach() —> onCreate() —> onCreateView() —> Activity:onCreate() —> onActivityCreated() —> Activity:onStart() —> onStart() —> Activity:onResume() —> onResume() —> onPause() —> Activity:onPause() —> onStop() —> Activity:onStop() —> onDestroyView —> onDestroy() —> onDetach() —> Activity:onDestroy()

1.3 Activity的启动模式

  • standard:标准模式,默认的启动模式,每次启动一个Activity都会创建一个新的实例,栈内多实例模式,默认进入启动它的Activity所在的任务栈;每个实例也可以属于不同的任务栈;
  • singleTop:栈顶复用模式,如果启动的Activity已经位于任务栈的栈顶,那么此Activity不会被重新创建,同时回调onNewIntent方法;如果Activity已存在但不位于栈顶,那么会创建新的Activity(原Activity还存在于任务栈中不变)
  • singleTask:栈内复用模式,栈内单实例模式;只要Activity在栈中存在,那么多次启动此Activity都不会创建新的实例,同时回调onNewIntent方法;如果Activity不在栈顶,会把当前Activity切换到栈顶,当前Activity上面的Activity全部出栈;
  • singleInstance:单实例模式,具有singleTask的所有特性,单独位于一个栈中,全局唯一;如果在这种模式的Activity中启动一个standard的Activity,会为新启动的Activity创建一个新的任务栈;

2. 服务 Service

服务(Service)是Android中实现程序后台运行的解决方案,适合去执行那些不需要与用户交互且需要长期运行在后台的任务. 即使程序被切换到后台,或者打开了另一个应用程序,服务仍然可以正常运行.
服务并不是运行在一个独立的进程中,而是依赖于创建服务时所在的应用程序进程,当应用程序被杀掉时,所有依赖该应用程序的服务也会停止.
服务默认是运行在主线程中的,我们需要在服务内部手动创建子线程来执行具体的任务,以免造成主线程被阻塞的情况.

2.1 服务的启动模式

  • 通过Context的startService()来开启服务,服务开启后就和调用者没有关系了:onCreate() —> onStartCommand() —> onDestroy();服务第一次创建时会调用onCreate方法,每次服务启动时都会调用onStartCommand()方法,onStartCommand方法可以被调用多次,通过Context的stopService()或者在Service内部调用stopSelf可以停止服务,这时服务的onDestroy方法会被回调.
  • 通过Context的bindService()来开启服务,服务于调用者进行绑定,调用者退出,服务也会跟着退出,调用者可以调用服务里的方法:onCreate() —> onBind() —>onUnbind() —> onDestroy()

2.2 IntentService

通过HandlerThread开启了一个新的工作线程

HandlerThread thread = new HandlerThread("IntentService[" + mName + "]");
thread.start();

创建一个ServiceHandler,并与HandlerThread建立绑定关系

mServiceLooper = thread.getLooper();
mServiceHandler = new ServiceHandler(mServiceLooper);

把intent传递到ServiceHandler

    @Override
    public void onStart(@Nullable Intent intent, int startId) {
        Message msg = mServiceHandler.obtainMessage();
        msg.arg1 = startId;
        msg.obj = intent;
        mServiceHandler.sendMessage(msg);
    }

在ServiceHandler中处理传递过来的intent,处理完成后调用stopSelf来关闭服务

    private final class ServiceHandler extends Handler {
        public ServiceHandler(Looper looper) {
            super(looper);
        }

        @Override
        public void handleMessage(Message msg) {
            onHandleIntent((Intent)msg.obj);
            stopSelf(msg.arg1);
        }
    }

3. 广播 Broadcast

广播是一种可以跨进程的通信方式,Android中每一个应用程序都可以对自己感兴趣的广播进行注册,用来接收自己感兴趣的广播内容 .

3.1 广播的分类

  • 标准广播:完全异步执行的广播,没有顺序,效率高,不能被拦截
  • 有序广播:同步执行的广播,有先后顺序,优先级高的广播接收器可以拦截广播

3.2 广播接收器

广播接收器可以自由地对自己感兴趣的广播进行注册,有相应广播发出时,广播接收器就能收到该广播,并在内部处理相应逻辑.

  • 动态注册:在代码中调用registerReceiver() 注册,最后要通过unregisterReceiver() 取消注册;可以自由的控制注册与取消的时机,但必须要在程序启动之后才能收到广播.
  • 静态注册:在AndroidManifest.xml中注册,程序未启动时就可以收到广播
  • 无论是静态注册还是动态注册都不要在onReceive( ) 方法中添加过多的逻辑或者进行耗时的操作,因为广播接收器中是不允许开启子线程的.

3.3 本地广播

以上说的都是全局广播,即发出的广播可以被任何其他应用程序接收到,我们也可以接收来自其他任何应用程序的广播.
使用本地广播机制发出的广播只能够在本应用程序内部进行传递,广播接收器也只能接收来自本应用程序发出的广播.
通过LocalBroadcastManager来对广播进行注册,发送,销毁;
本地广播只能通过动态方式注册,不允许静态注册;

4. 内容提供器 Content Provider

内容提供器主要用于在不同的应用程序之间实现数据共享的功能,它提供了一套完整的机制,允许一个程序访问另一个程序中的数据,同时还能保证被访数据的安全性,是Android实现跨程序共享数据的标准方式.

4.1 使用现有的内容提供器来读取和操作响应程序中的数据

ContentResolver
通过Context中的getContentResolver( )获取该类实例,提供了CRUD操作的方法;
不同于SQLiteDatabase,ContentResolver中的增删改查不接收表名,而是URI,URI由两部分组成:authority(区分程序)和path(区分表名) content://com.david.first/table1 以获取手机联系人为例:

private void readContacts(){
    Cursor cursor = null;
    try{
        cursor = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
                null,null,null,null);
        if (cursor!=null){
            while (cursor.moveToNext()){
                //获取联系人姓名
                String  name = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
                //获取手机号码
                String phone = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
            }
        }
    }catch (Exception e){
        e.printStackTrace();
    }finally {
        if (cursor!=null){
            cursor.close();
        }
    }
}

4.2 创建自己的内容提供器给我们程序的数据提供外部访问接口

创建类继承ContentProvider,重写6个抽象方法;
借助UriMatcher的addURI( )实现匹配URI的功能;

  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值