A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 邓显俊 中级黑马   /  2016-8-30 21:57  /  374 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

四大组件+Intent(四大组件的通信):
1、Activity
        一个界面对应一个Activity
2、Broadcast
        广播(电话)
3、Services
        无界面,相应时间长(下载/后台听歌)
4、ContentProvider
        权限相关
Android中View类
1、View树
        ViewGroup(LinearLayout/RelativeLayout/AbsolateLayout/FrameLayout/TableLayout)

   ViewGroup        View        View
View    View
2、View分类
TextView
ImageView
KeyboardView
ProgressBar
SurfaceView
ViewGroup

3、定义多Activity步骤
----定义Activity类+layout布局文件
----在manifest中生命类
----定义Intent对象
----通过intent启动activity

4、本地持久化(例如记住密码)
        小文本内容:sharedpreference
        不规则文件:文件系统存储
        有关系,复杂:SQLite(联系人)
5、网络访问:
        http
        urlConn

-------------------------------------------------
2016/7/14
1. Activity的四种启动模式(可以在manifest中launchMode控制或者intent.addFlags)
        a. 标准模式(默认): 调用startActivity即可产生一个新的实例
                若我有一个Activity名为A1, 上面有一个按钮可跳转到A1。那么如果我点击按钮,便会新启一个Activity A1叠在刚才的A1之上,再点击,又会再新启一个在它之上……
                点back键会依照栈顺序依次退出。
        b. singleTop:如果已经有一个实例位于Activity栈顶部,就
                不产生新的实例,而是调用该Activity的onNewInstance
                如果不位于栈顶,则产生新的实例
        c. singleTask:在新的task产生实例,以后每次调用就用这个实例
                同一个应用程序中启动他的时候,若Activity不存在,则会在当前task创建一个新的实例,若存在,则会把task中在其之上的其它Activity destory掉并调用它的onNewIntent方法
                如果是在别的应用程序中启动它,则会新建一个task,并在该task中启动这个Activity,singleTask允许别的Activity与其在一个task中共存,
                        也就是说,如果我在这个singleTask的实例中再打开新的Activity,这个新的Activity还是会在singleTask的实例的task中。
                singleTask会把task中在其之上的其它Activity destory掉。
        d. singleInstance:在activity的task中产生新的实例
                只有一个实例,并且这个实例独立运行在一个task中,这个task只有这个实例,不允许有别的Activity存在。

Service
        a. Service是在一段不定的时间运行在后台,不和用户交互应用组件。
        b. 每个Service必须在manifest中 通过<service>来声明。可以通过contect.startservice和contect.bindserverice来启动。
        c. Service和其他的应用组件一样,运行在进程的主线程中。这就是说如果service需要很多耗时或者阻塞的操作,需要在其子线程中实现。

        Service的2中模式:
        1. startService()/ stopService():(调用者和服务没有关联,需要显示调用stopService关闭服务)
                用于应用程序内部服务:用于实现应用程序自己的一些耗时任务,比如查询升级信息,并不占用应用程序比如Activity所属线程,而是单开线程后台执行,这样用户体验比较好。
                调用生命周期:context.startService() ->onCreate()- >onStart()(可能被多次调用)->Service running
                              context.stopService() | ->onDestroy() ->Service stop
        2. bindService()/ unBindService()(调用者和服务关联,调用者一旦退出,服务自动关闭)
                用于android系统内部应用程序之间。比如调用天气服务,短信服务等,可以被其他应用程序复用
                它可以通过自己定义并暴露出来的接口进行程序操作。客户端建立一个到服务对象的连接,并通过那个连接来调用服务。
                调用生命周期:context.bindService()->onCreate()->onBind()->Service running
                              onUnbind() -> onDestroy() ->Service stop
        启动service,根据onStartCommand的返回值不同,有两个附加的模式:
        1. START_STICKY 用于显示启动和停止service。
         2. START_NOT_STICKY或START_REDELIVER_INTENT用于有命令需要处理时才运行的模式。

BroadCast Receiver
        用于异步接收广播Intent。主要有两大类,用于接收广播的:
        1. 正常广播 Normal broadcasts用 Context.sendBroadcast()发送,完全异步
        2. 有序广播 Ordered broadcasts(用 Context.sendOrderedBroadcast()发送)每次被发送到一个receiver
          Broadcast Receiver 并没有提供可视化的界面来显示广播信息。
                可以使用Notification和Notification Manager来实现可视化的信息的界面,显示广播信息的内容,图标及震动信息
        注册Receiver
        1. 静态注册:在AndroidManifest.xml的application里面定义receiver并设置要接收的action。
        2. 动态注册:在activity里面调用函数来注册,和静态的内容差不多。一个形参是receiver,另一个是IntentFilter
     Permission权限
          要接收某些action,需要在AndroidManifest.xml里面添加相应的permission。例如接收SMS:

        一个receiver可以接收多个action的,即可以有多个intent-filter,需要在onReceive里面对intent.getAction(action name)进行判断。
          ps:个人推荐使用静态注册方式,由系统来管理receiver,而且程序里的所有receiver,可以在xml里面一目了然。而动态注册方式,隐藏在代码中,比较难发现。
             而且动态注册,需要特别注意的是,在退出程序前要记得调用Context.unregisterReceiver()方法。一般在activity的onStart()里面进行注册, onStop()里面进行注销。
            官方提醒,如果在Activity.onResume()里面注册了,就必须在Activity.onPause()注销。
ContentProvider:
        主要用于对外共享数据,也就是通过ContentProvider把应用中的数据共享给其他应用访问,其他应用可以通过ContentProvider对指定应用中的数据进行操作。
        ContentProvider分为系统的和自定义的,系统的也就是例如联系人,图片等数据。

1 个回复

正序浏览
仅供参考
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马