Activity
1 fragment以及与activity交互
(1)通过Bundle传参,从而实现Fragment之间的数据交互
(2)通过在Fragment内部定义一个回调接口,并需要宿主Activity实现它。当Activity通过接口接收到回调时,可以在必要时与布局中的其它Fagment共享信息
2 Activity生命周期与启动模式
1.onCreate()
这个方法在每一个Activity类都会有,当我们新建一个Activity类时,一定会重写父类的onCreate方法,
onCreate方法会在Activity第一次被创建时调用
。我们应该在这个方法中完成Activity的初始化操作,比如说加载布局,初始化布局控件,绑定按钮事件等。
2.onStart()
这个方法在Activity由不可见变为可见时调用。
3.onResume()
这个方法在Activity准备好和用户交互的时候调用。此时的Activity一定位于返回栈的栈顶,并且处于运行状态。
4.onPause()
这个方法在系统准备去启动或者恢复另一个Activity的时候调用。
5.onStop()
这个方法在Activity完全不可见的时候调用。它和onPause()方法的主要区别在于,如果启动的新Activity是一个对话框式的activity,那么,onPause()方法会得到执行,而onStop()方法并不会执行。
6.onDestory()
这个方法在Activity被销毁之前调用,之后Activity的状态将变为销毁状态。
7.onRestart()
这个方法在Activity由停止状态变为运行状态之前调用,也就是Activity被重新启动了。
启动模式:
-
标准模式( Standard )
-
栈顶复用模式( SingleTop )
-
栈内复用模式( SingleTask )
-
单例模式( SingleInstance )
3 activity启动流程
我们可以从Context的startActivity说起,其实现是ContextImpl的startActivity,然后内部会通过Instrumentation来尝试启动Activity,这是一个跨进程过程,它会调用ams的startActivity方法,当ams校验完activity的合法性后,会通过ApplicationThread回调到我们的进程,这也是一次跨进程过程,而applicationThread就是一个binder,回调逻辑是在binder线程池中完成的,所以需要通过Handler H将其切换到ui线程,第一个消息是LAUNCH_ACTIVITY,它对应handleLaunchActivity,在这个方法里完成了Activity的创建和启动,接着,在activity的onResume中,activity的内容将开始渲染到window上,然后开始绘制直到我们看见
service
1 service启动方式和区别
startService 启动的服务:主要用于启动一个服务执行后台任务,不进行通信。停止服务使用stopService;
bindSe
r
vice 启动的服务:
该方法启动的服务可以
进行通信
。停止服务使用unbindSe
r
vice;
1 )采用start的方式开启服务
使用Service的步骤:
1.定义一个类继承Service2.在Manifest.xml文件中配置该Service3.使用Context的startService(Intent)方法启动该Service4.不再使用时,调用stopService(Intent)方法停止该服务
使用这种start方式启动的Service的
生命周期如下:
生命周期:onCreate()
--->
onStartCommand()
(
onStart()
方法已过时) --->
onDestory()
说明:如果服务已经开启,不会重复的执行onCreate(), 而是会调用onStart()和onStartCommand()。
服务停止的时候调用 onDestory()。服务只会被停止一次。
特点
:一旦服务开启跟调用者(开启者)就没有任何关系了。
开启者退出了,开启者挂了,服务还在后台长期的运行。
开启者
不能调用
服务里面的方法。
2)采用bind的方式开启服务
使用Service的步骤:
1.定义一个类继承Service2.在Manifest.xml文件中配置该Service3.使用Context的bindService(Intent, ServiceConnection, int)方法启动该Service4.不再使用时,调用unbindService(ServiceConnection)方法停止该服务
使用这种start方式启动的Service的
生命周期如下:
生命周期:onCreate()
--->
onBind()
--->
onunbind()
--->
onDestory()
注意:绑定服务不会调用onstart()或者onstartcommand()方法
特点
:bind的方式开启服务,绑定服务,调用者挂了,服务也会跟着挂掉。
绑定者可以调用服务里面的方法。
2 service与activity交互与通信方式
活动是需要和服务进行交互的,比如
音乐播放界面
,用户可以根据播放进度条掌握播放的
进度
,用户也可以自己根据歌词的进度选择调整整首歌的进度
1)
创建一个专门的
Binder类
来进行管理
当Activity通过调用bindService(Intent service, ServiceConnection conn,int flags)
,我们可以得到一个Service的一个对象实例,然后我们就可以访问Service中的方法
2 )
通过broadcast(广播)的形式
当我们的进度发生变化的时候我们发送一条广播,然后在Activity的注册广播接收器,接收到广播之后更新ProgressBar,
3 service与线程的区别
1.) 服务不是单一的进程。服务没有自己的进程,应用程序可以不同,服务运行在相同的进程中。
2.) 服务不是线程。可以在线程中工作。
一.在应用中,如果是长时间的在后台运行,而且不需要交互的情况下,使用服务。
同样是在后台运行,不需要交互的情况下,如果只是完成某个任务,之后就不需要运行,而且可能是多个任务,需需要长时间运行的情况下使用线程。
二.如果任务占用CPU时间多,资源大的情况下,要使用线程。
servie是系统的组件,它由系统进程托管(servicemanager);它们之间的通信类似于client和server,是一种轻量级的ipc通信,这种通信的载体是binder,它是在linux层交换信息的一种ipc。而thread是由本应用程序托管。
1). Thread:Thread 是程序执行的最小单元,它是分配CPU的基本单位。可以用 Thread 来执行一些异步的操作。
2). Service:Service 是android的一种机制,当它运行的时候如果是
Local Service,那么对应的Service 是运行在主进程的 main 线程上
的。如:onCreate,onStart 这些函数在被系统调用的时候都是在主进程的 main 线程上运行的。如果是
Remote Service,那么对应的 Service 则是运行在独立进程的 main 线程上
。
既然这样,那么我们为什么要用 Service 呢?其实这跟 android 的系统机制有关,我们先拿Thread 来说。
Thread 的运行是独立于 Activity 的,也就是说当一个 Activity 被 finish 之后,如果你没有主动停止 Thread 或者 Thread 里的 run 方法没有执行完毕的话,Thread 也会一直执行。
因此这里会出现一个问题:当 Activity 被 finish 之后,你不再持有该 Thread 的引用。另一方面,你没有办法在不同的 Activity 中对同一 Thread 进行控制。
举个例子:如果你的 Thread 需要不停地隔一段时间就要连接服务器做某种同步的话,该 Thread 需要在 Activity 没有start的时候也在运行。这个时候当你 start 一个 Activity 就没有办法在该 Activity 里面控制之前创建的 Thread。因此你便需要创建并启动一个 Service ,在 Service 里面创建、运行并控制该 Thread,这样便解决了该问题(因为任何 Activity 都可以控制同一 Service,而系统也只会创建一个对应 Service 的实例)。
因此你可以把 Service 想象成一种消息服务,而你可以在任何有 Context 的地方调用Context.startService、Context.stopService、Context.bindService,Context.unbindService,来控制它,你也可以在 Service 里注册 BroadcastReceiver,在其他地方通过发送 broadcast 来控制它,当然这些都是 Thread 做不到的
broadcastreceiver
1 静态与动态广播区别,静态广播如何启动
1)动态注册的广播永远要快于静态注册的广播,不管静态注册的优先级设置的多高,不管动态注册的优先级有多低
2)生存期,静态广播的生存期可以比动态广播的长很多,因为静态广播很多都是用来对系统时间进行监听,比如我们可以监听手机开机。而动态广播会随着context的终止而终止
3)动态广播无需在AndroidManifest.xml中声明即可直接使用,也即动态;而静态广播则需要,有时候还要在AndroidManifest.xml中加上一些权限的声明
4)
动态注册的广播会受Activity的生命周期的影响, 当Activity销毁的时候,广播就失效了。
而静态注册的广播,即使Activity销毁了,仍然可以收到广播。更牛掰的是即使杀死进程,仍然可以收到广播
静态广播如何启动:
静态注册(清单文件注册)
2 本地广播实现原理
使用LocalBroadcastManager有如下好处:
1. 发送的广播只会在自己App内传播,不会泄露给其他App,确保隐私数据不会泄露
2. 其他App也无法向你的App发送该广播,不用担心其他App会来搞破坏比系统全局广播更加高效
先通过
LocalBroadcastManager lbm = LocalBroadcastManager.getInstance(this);
1
获取实例,然后通过函数 registerReceiver来注册监听器
lbm.registerReceiver(new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
// TODO Handle the received