类型:是一个展示型组件。
作用:展示一个界面并与用户交互。
使用:
Intent intent= new Intent(this,Activity2.class),startActivity(intent)
,注意传入的是class而不是Acitivity。Intent intent=new Intent(); intent.setAction(xxx); intent.addCategory(xxx); startActivity(intent);
intent会匹配可以响应Action与Category的Acitivity并启动该Acitivity。四种启动模式
1.Standard:普通模式。每次启动一个Activity就会创建一个新的实例
2.SingleTop:栈顶复用模式。当栈顶为当前要启动的Acitivity,则不会启动Acitivity,直接调用onNewIntent方法;
3.SingleTask:栈内复用模式,当所启动的Activity在当前的栈内,则不会启动Activity,直接调用onNewIntent方法;如果没有找到则会先去判断是否存在当前栈,如果不存在则会创建当前寻找的栈,并将Activity放入其中,否则直接将Activity放入当前栈中。
4.singleInstance:单例模式。具有此模式的Activity只能单独位于一个任务栈中,且此任务栈中只有唯一一个实例。
使用finish
方法可以结束一个Activity。
首先调用startActivity(intent)方法,这个方法最终会调用startActivityForResult()方法,同时requestCode为-1以区分正常调用该方法的情况。
之后会调用AMS(ActivityMangerService)的startActivity方法,AMS是一个实现了binder的类。通过IPC机制会继续调用AppllactionThread(ActivityThrea内部类)的scheduleLaunchAcitivity方法,在该方法中会通过sendMessage与Handler通信。
Handler H会首先调用handleLaunchActivity方法,之后会调用performLaunchActivity方法。在performLaunchActivity中会完成对Activity的创建与启动。
performLaunchActivity方法一共完成了如下工作:
(1)从AcitivityClientRecord中获取Activity的组件信息;
(2)通过Instrumentation来创建Activity,使用类加载器的方式(ClassLoader.loadClass);
(3)调用了makeApllication方法,尝试创建Application(只会有一个Application),内部也是通过Instumentation以类加载器的方式创建的;
(4)创建ContextImpl对象,并通过Acitivity的attach方法来完成一些重要参数的初始化。(通过attach方法建立了ContextImpl与Activity的关系);
(5)调用Activity的onCreate方法。
1.Activity的AMS和ActivityThread都是Binder;
2.Activity和Applaction的创建都是通过Instumentation创建的,类加载模式(loadClass方法);
3.AMS的startActivity方法会通过IPC方式调用Applaction的scheduleLaunchActivity,并在其中使用sendMessage方法,进而使用HandlerH。
4.HandlerH对消息的处理是通过HandlerH的handleLaunchActivity与performLaunchActivity完成的,并最终创建和启动Activity
类型:计算型组件。
作用:执行一些需要长期运行的程序。
使用:
Intent intent = new Intent(this, xxx.class); startService(intent);
两种开启方法:
1.startService(intent)
开启服务;
2.bindService(intent,Serviceconnection,flag)
绑定服务,unbind(ServiceConnection)
取消绑定服务。
不可以被用户看见;
通过stopService
和unbind
完成停止一个服务。
首先调用startService()方法,之后调用ContextImpl的startService方法,进而调用startServiceCommon方法。接下来会调用AMS的startService方法。
AMS的startService会调用ActiveService的方法,ActiveService是一个辅助AMS进行管理的类,包括Service的启动绑定和停止。最终会调用ActiveService的realStartServiceLocked()方法。
在realStartServiceLocked首先会调用ApplicationThread的scheduleCreateService进行创建服务并调用其onCreate方法,调用SendServiceArgs来回调Service的onStartCommand方法。上述两个方法都是跨进程方法。
**scheudleCreateService方法的逻辑与ScheudleLaunchActivity相似,都是调用sendMessage,使用Handler来执行操作。**而sendServiceArgsLock,则会去调用Handler的handleServiceArgs方法。
Handler会调用handleCreateService。handleCreateService一共做了四件事:(1)会通过类加载的方式创建Service的实例,(2)创建Applaction并调用OnCreate方法。(3)创建ContextImpl并通过Service的attach方法建立与Service的连接。(4)调用Service的onCreate方法并将Service存储在ActivityThread的一个ArrayMap中;
handleServiceArgs方法会调用Service中的onStartCommand方法。
(其中ActivityServices应该是ActiveService)
与启动相类似,首先调用ConextWrapper的bindService方法,之后调用ContextImpl的bindService方法(进而调用bindServiceCommon方法)。
在bindServiceCommon方法中主要是将ServiceConnection对象转化为Binder对象(因为可能会跨进程,将ServiceConnection转换为ServiceDisapcther.InnerConnection)
之后类似地,调用AMS的bindService方法;AMS会调用realStartSeriviceLocked方法完成服务的创建与上面相同,不同的是会调用requestServceBindingLocked方法进行绑定。
调用requestServceBindingLocked方法会调用ApplicationThread的shceduleBindService,通过sendMessage发送消息给Handler H,并调用handleBindService方法。
在handleBindService方法中,首先通过onBind获取Binder对象,之后调用AMS中的publishService方法,去通知客户端结果。
publishService会继续调用ActiveServices的publishServiceLocked方法,核心调用是核心代码c.conn.connected(r.name, service); 其中c.conn是ServiceDispatcher.InnerConnection,Service就是Service的onBind返回的Binder对象。这个connected方法就会去调用ServiceConnection的onServiceConnected方法。
1.ContextImpl是Context的实现,可以通过Actvity的attach方法与其建立连接。Activity.attach()中还会完成Window的创建并和Activity&Window的关联,由此事件可传递给Window。
2.ActiveServices是一个辅助AMS的类,在该类中可以进行服务的创建(realStartedServiceLocked)与绑定(requestServceBindingLocked)。同时其中的方法后缀都是Locked。
3.与Activity类似的,Service的创建与绑定最终都会回到ActivityThread类下的handleCreateService
与handleBindService
。同时handleServiceArgs是用于回调Service中的其他方法。注意绑定同时要告知客户端,所以要调用AMS的publishService
方法。(ActivityThread下的方法都是handlexxxx,因为都是Handler H的方法)
(1)startActivity->startActivityForResult(requestcode=-1)->ActivityMangagerService(Binder对象)的startActivity;
(2)通过IPC的方式,调用ApllicationThread的scheduleLaunchActivity,在该方法中会通过sendMessage来发送消息;
(3)之后HanlderH会接收到消息,并分别调用handleLaunchActivity->performLaunchActivity来完成Activity的创建与启动。
performLaunchActivity一共完成了以下几个工作:(1)通过ActivityClientRecord获取要启动的Activity的组件信息;(2)通过Instrumentation的newActivity方法来创建Activity,使用的是类加载的方式(loadClass);(3)使用LoadedAPK的makeApplication来尝试创建Application,内部调用Instrumentation来创建Apllication,也是类加载的方式;(4)创建ContextImpl,同时使用Activity的attach,与ContextImpl 建立联系,并进行初始化操作。(5)调用Activity的onCreate函数。
(1)调用startService(intent)
->ContextImpl的startServiceCommon
->AMS的startService;
(2)AMS会调用ActiveService的方法,ActiveService是一个辅助AMS的服务,最终会调用它的realStartServiceLocked来开启服务。
(3)realStartServiceLocked方法之后会调用ApplicationThread的scheduleCreateService,通过sendMessage与Handler H通信,并调用hadnleCreateService。完成对Service的创建和启动。
(4)realStartServiceLocked也会调用SendServiceArgs来调用handleServiceArgs,并最终回调用Service的onStartCommand方法。
HandleCreateService主要做到了:(1)完成对Service的创建(类加载模式);(2)创建Application并调用onCreate方法(3)创建ContextImpl并通过Service的attach方法建立两者联系;(4)调用Service的onCreate方法并将Service对象存储在ActivityThread的一个ArrayMap中。
bindService(intent,serviceConnection,flag)->ContextImpl的bindServiceCommon,在该函数中需要将ServiceConnection对象转换为一个Binder对象,以便跨进程通信,转换为ServiceDispatcher.InnerConnection。
之后会调用AMS的bindService,进而调用ActiveService的方法,调用realStartServiceLocked和Service开启相似;调用requestServiceBindingLocked实现绑定功能。
之后会调用Application的scheduleBindService,来通知Hanlder H,Handler H会调用handleBindService来绑定,
在该函数中首先通过onBind方法获取服务端的Binder对象,然后需要通知客户端绑定结果。因此调用AMS的publishService方法,该方法会最终回调ServiceConnection对象的onServiceConnected。