APIGuide_应用组件
Intent和Intent Filter(周二)
Intent是一个消息传递对象。 分类
显示Intent(限定了完整类名),没有特殊要求最好使用显示Intent 隐式Intent:不指定特定的组建名称,至声明操作内容。 系统识别意图的依据:Action\Data&DataType\Categary <intent-filter>:当使用隐式Intent时,可以为组件声明意图过滤器,来约束当前组件需要满足的意图条件,这意味着只要有应用显示的调用含有该意图过滤器的组件,同时他满足了上面识别意图的三个标识,则可达到启动该组件的目的。例如:在淘宝app中启动天猫app展示天猫商店商品。但需要注意当我们通过显示意图调用潜在的隐式意图app时,如果符合意图过滤器的组建个数不同,需要处理的手段也不同:
0:没有满足的组件,调用应用会崩溃,所以所有类似调用方式都需要先行判断resolveActivity(getPackageManager()>0?你的操作:返回; 1:只有一个满足条件的app,会立即启动该app >1:当不只有一个app满足条件的时候,系统会默认选择一个列表,当然我们可以通过Intent.createChooser(),来做一些更有好的界面处理。 当我们决定让某些组件不允许通过显示意图来调用的时候,可显示的为配置文件中为该组件设置exported=false; 完整示例:
`Intent sendIntent = new Intent(Intent.ACTION_SEND);
// Always use string resources for UI text.
// This says something like "Share this photo with"
String title = getResources().getString(R.string.chooser_title);
// Create intent to show the chooser dialog
Intent chooser = Intent.createChooser(sendIntent, title);
// Verify the original intent will resolve to at least one activity
if (sendIntent.resolveActivity(getPackageManager()) != null) {
startActivity(chooser);
}`
Activity(周三)
Activity的生命周期 Activity的onSaveInsatnceState()和屏幕旋转
Service(周一)
特点:不十分准确的说,类似于一种没有UI的且运行在后台的Activity,默认运行在主线程中。 两种创建模式:
startService()启动,stopslef()或者stopService()终止运行,即使当前应用已退出,也可长期运行在后台,不参与用户交互操作,运行完成则终止。 bindService()绑定具体其他组件,与该组件通过IBinder接口进行通信,可以多个组件共同绑定同一Service对象,当该对象上的所有绑定对象全部解绑时终止运行。 绑定服务:可应用与同进程应用内部通信,单线程、多线程进程间通信(IPC)
在同进程的应用内部使用,可通过扩展Binder类实现。 在不同进程单线程操作队列使用能够,可直接使用Messenger+Hanlder来处理。 在不同进程多线程操作,需要使用AIDL来处理。 IBinder:进程间通信的桥梁和信息载体,无论是那种绑定的通信方式,都需要通过服务前端的onBind()方法返回的IBinder对象来关联两个通信双方,客户端则通过ServicerConnection接口回调来处理IBinder所携带的信息。 AIDL:多进程间的多线程通信语言
Content Provider
内容提供程序正对的是一组结构化的数据集,他们封装数据并提供定义数据安全性的机制;是连接一个进程与另一个进程之间的标准化界面。
App Widget
Broadcasts(周二)
注册方式:
静态注册:manifest<intent-filter></intent-filter> 动态注册: 注意事项:
不要在和启动Activity公用同一个Intent 在OnRecived()里面耗时操作的时候,注意使用goAsyn()或者JobScheduler 发送广播的三种方式:有序、群发、限定本地 广播的安全最佳实践: Processes and Application Life Cycle:系统会结合当前组件的进程等级以及内存等系统资源使用状况,决定是否主动销毁当前app components JobService&JobScheduler:JobService集成Service,通过绑定的方式重写了OnBind())实现AIDL,通过JobScheduler实现信息调度。需要注意的是默认情况下,他是运行在主线程中的后台程序,所以如需执行复杂耗时操作请开启异步线程。具体可以参考这篇博客,基本用法写的还算可以:http://blog.csdn.net/fishle123/article/details/50790894 PendingResult:BroadCaseReceiver的状态值,是通过goAsyn()方法返回的,当完成的时候,必须调用finish()来通知系统OnReceived()方法执行完毕,让系统Process回收资源。
Process and Thread(周二)
默认情况下,Android是单进程多线程的应用机制:
在配置文件中可以为四大组件单独设置所要运行的进程,通常我们不需要这么做。实现同一应用内部存在多个进程运行组件的一对多的状态, 同时多个应用的组件也可以运行在同一进程中,前提是这些应用的Linux ID(沙盒机制的唯一标识)在各自的配置文件中是完全相同的并使用相同的签名证书,进而实现多对一的状态。 分类(按照权限等级由高到底):
前台进程:正在于用户交互的,例如:OnResume状态的Activity及绑定在该Activity上的Service,OnReceivd的BroadCastReceiver等等。 可见进程:对用户可见,但是不在交互状态,例如:OnPause状态的Activity 服务进程:除去上面两种状态的Service 不可见进程:对用不可见,例如:OnPause状态的Activity 空进程:用来加快组件加载速度的,起到缓存作用 线程:Android默认进程内的默认线程称作是主线程,因为其与widget和view包下的组件进行交互故有称作UI线程,默认同一进程内的操作都是在主线程进行的,但是耗时操作会阻塞UI线程,时间长了会到时ANR异常,所以就引出了工作线程,但是不能在工作线程中操作UI线程与widget和view包内控件的交互操作,愿意是UI线程制订了如下规则:
不能阻塞UI线程 不要再UI线程之外访问Android UI工具包(因为它是非线程安全的) 工作线程操作U工具包的方案:
主动调用Activity.runOnUiThread(Runable) View.post(Runable) View.postDelayed(Runable, long) Handler AsyncTask