美文网首页
Android四大组件

Android四大组件

作者: 橘子树上结西瓜 | 来源:发表于2018-01-15 14:51 被阅读6次

    Activity被意外销毁

    * 销毁原因
    当资源相关的系统配置发生改变,系统默认会销毁Activity并且重新创建;
    如:屏幕竖屏切换为横屏,系统会销毁Activity,重新配置横屏应该对应的图片。mdpi/hdpi
    * 如何处理?
    1.可以在清单文件配置Activity的android:configChanges;
    指定某些配置改变的情况下不重建.
    如:android:configChanges="orientation|keyboardHidden|screenSize"
    切屏的情况下不重建Activity
    2.异常情况下销毁Activity,会调用onSaveInstanceState,我们可以在该方法里面
    缓存一些重要消息,如保存字符串:savedInstanceState.putString(key,value);
    Activity重建的时候会调用onRestoreInstanceState();
    可以从中取出销毁前缓存的数据,savedInstanceState.getString(key);
    

    Activity的启动模式

    * standard标准模式:
        启动Activiy:A1,每一次都创建A的新实例在它之上,按栈顺序依次出栈
    * singleTop栈顶模式:
        (1)不允许相同的Activity重复叠加在一个栈上,
           启动Activity:A1,如果A1在栈顶就复用他。
        (2)使用场景:
        ——在通知栏点击后需要启动一个活动,这个就要用到这个模式,
        否则的话每次点击都会新建一个活动,你可能说怎么会干这个无聊的事,
        你不会不代表用户不会。
        ——短信发送界面Acitvity
    * singleTask:
        单一任务栈,同一应用中只有一个实例.
        (1)启动A:如果在任务栈中还有b,c,就destory掉b,c
        (2)应用场景:如果一个Activity非常消耗内存和cpu资源,
        建议把这个Activity做成singletask的模式[节约资源]==>浏览器browserActivity
    
    * singleInstance
        只有一个实例,且独占一个任务栈.
        (1)启动A:如果在任务栈中还有b,c,就会重新创建任务栈再把a放入新建的任务栈
        (2)使用场景:
           通话界面Activity
    

    Service

    1.使用方式:
    * startService
    主要用于启动一个服务执行后台任务,不进行通信。停止服务使用stopService。
    * bindService
    方法启动的服务要进行通信。停止服务使用unbindService。
    * 注:
    (1)startService的服务生命周期
    ====一个Service被使用startService方法启动,不管是否调用了
    bindService(绑定服务)或unbindService(解除绑定服务)到该Service,该Service都
    会在后台运行并不受影响
    ====startService方法启动多少次,onCreate方法只会调用一次,
    onStartCommand方法将会被调用多次(与startService的次数一致),且系统只会创建
    一个Service实例(结束该Service也只需要调用一次stopService),该Service会一直
    在后台运行,直至调用stopService或调用自身的stopSelf方法
    (2)bindService
    ====调用bindService方法启动,不论bindService被调用几次,Service的onCreate方法
    只会执行一次,同时onStartCommand方法始终不会调用
    ====当建立连接后,Service会一直运行,除非调用unbindService来解除绑定,
    或者调用该Service的Context不存在了,如Activity被finish掉,系统会停止服务
    (3)同时使用startService、bindService 启动的服务
    停止服务应同时使用stopService与unbindService。
    
    2.运行地点:
    本地服务:该服务依附在主进程上
    远程服务:该服务是独立的进程并且使用AIDL进行IPC稍微麻烦一点,
    一些提供系统服务的Service,这种Service是常驻的。如:第三方支付
    
    3.bindService()用法
    (1)创建服务类,重写onBind(),返回自定义的代理对像MyBinder
    (2)bindService(intent,new Myconn(),BIND_AUTO_CREATE);
    链接服务
    class Myconn implements ServiceConnection {
        onServiceConnected() {//成功
            myBinder = Service;
        }        
    }
    (3)myBinder.方法()调用服务
    
    4.远程服务AIDL
    定义aidl:先定义接口,再把接口后缀名改为aidl
    特点:无法识别public
    作用:进程间通信Binder.
    * 1.编写远程服务和本地服务类似,在清单文件申明,设置其action
    * 2.调用:
        //绑定服务,通过action来识别服务
        intent.setAction("com.zk.romoteService");
        bindService(intent,new MyConn(),BIND_AUTO_CREATE);
        //链接服务得到代理对象
        MyConn implements ServiceConnection{
            Connected() {
                iService = Iservice.Stub.asInterface
            }        
        }
        //通过代理对象调用服务里的方法
        iService.callMethodInservice();
        
    * 3.定义的接口Iservice.aidl
    interface Iservice{
        void callMethodInservice();
    }
    

    BroadcastReceiver

    不适合做耗时操作
    动态注册:跟随Activity的生命周期
    静态注册:常驻
    
    * 普通广播(context.sendBroadcast())
    1.完全是异步的,可以在同一时刻被所有接受者接收到
    2.效率高
    3.不能将处理结果传递给下一个接收者,并且无法终止广播intent的传播
    
    * 有序广播(context.sendOrderrdBroadcast())
    按照接收者声明的优先级别,被接受者一次接收广播,A->B->C
    

    ContentProvider

    实现和第三方app进行共享数据[开放自己的应用数据给其它应用进行增删改查,
    而不用担心安全问题]
    系统的ContentProvider:通话记录,短信,通讯录
    
    * eg:content://me.pengtao.contentprovidertest/test
    【uri映射到数据库表】
    Authority:授权信息,用以区别不同的ContentProvider;
    Path:表名,用以区分ContentProvider中不同的数据表;
    Id:Id号,用以区别表中的不同数据;
    
    * UriMatcher的使用
    
    * 数据共享
    1.数据方:
    声明权限
    <permission android:name="me.pengtao.READ" android:protectionLevel="normal"/>
    更改provider标签
    <provider
        android:authorities="me.pengtao.contentprovidertest"
        android:name=".provider.TestProvider"
        android:readPermission="me.pengtao.READ"
        android:exported="true">
    </provider>
    2.其它应用中访问
    <uses-permission android:name="me.pengtao.READ"/>
    

    相关文章

      网友评论

          本文标题:Android四大组件

          本文链接:https://www.haomeiwen.com/subject/rrxdoxtx.html