Android学习日志(2.1)
2018/07/24
一、service
1.service存在一个新的java文件通过,new/service创建
2.与MainActivity相似的是,MainActivity extends AppCompatActivity,Mainservice extends service
3.注意onbind()方法、binder对象:用于进程间通信。
onBind方法就是当试图绑定服务时做的事,作用一般情况下主要是返回IBinder对象,为后面服务成功绑定时的操作做准备。
a.不使用绑定时,service与客户端没有联系,只要不调用stopService,Service将一直运行。
b.bindService模式下的Service是与调用者相互关联的
c.如果Service已经由某个客户端通过StartService()启动,接下来由其他客户端再调用bindService()绑定到该Service后调用unbindService()解除绑定最后在调用bindService()绑定到Service的话,此时所触发的生命周期方法如下:
onCreate( )->onStartCommand( )->onBind( )->onUnbind( )->onRebind( )
4.Service中有几种方法:OnCreate()、OnStartCommond(intent,flag,startId)、OnDestory()、IBinder onOnbind(intent)、onUnbind(intent).
- IBinder onOnbind(intent):该方法是Service都必须实现的方法,该方法会返回一个 IBinder对象,app通过该对象与Service组件进行通信.
其中OnStartCommond可以复用,OnCreate()只能在创建Service时使用。
5.通过StartSrevice(intent)和StopService(intent)调用Service。
二、广播Broadcast
1.Android中的每个应用程序都可以对自己感兴趣的广播进行注册,这样程序就可接受到自己感兴趣的广播。
换句话说,广播需要注册才能传播。
2.发送广播:intent,接受广播需要广播接收器Broadcast Receiver。
3.广播分为标准广播和有序广播,前者指的是广播传递时完全异步执行,后者广播传递有先后顺序。
有序广播可以通过设置优先级来确定先后顺序,先传递到的广播也可以截断广播。
4.广播接收器需要对广播注册,才能接受,并且在内部处理相应的逻辑。注册方法有两种:
a.动态注册:在代码中注册(Activity)
b.静态注册:在AndroidManifest.xml中注册
5.动态创建广播接收器需要做到两点:继承Broadcast Receiver,重写onReceiver()。具体的逻辑在onReceiver()中执行。
6.IntentFilter的作用:翻译为连接过滤器(?),在原来所学的知识中,作用为在AndroidManifest.xml中注册谁为主活动。
这里在MainActivity的运用是添加相应的action使得广播接受器能够监听到相应的广播。
eg:intentFilter = new IntentFilter();
intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
接下来需要将所创建的广播接收器实例与intentFilter注册,通过registerReceiver()方法进行注册,这样才能使得广播接收器实例接收到这条广播。
注意: 动态注册的广播接收器需要取消注册,这一点是通过onDestory()方法中通过调用unregisteReceiver()实现
其他注意事项:这里的Toast用法没有搞清楚,访问系统的网络状态需要权限,要在AndroidManidest.xml中注册权限。
7.静态注册广播接收器:new/Other/Broadcast Receiver.
同时需要对AndroidManifese.xml.做修改才能接受新的广播。
具体方法见《第一行代码》
8.发送自定义广播:Intent intent = new Intent("com.example.broadcasttest.MY_BROADCAST");
sendBroadcast(intent);
//有序:sendOrderedBroadcast(intent,null);
9.设定优先级的方法:<intent-filter android:priority="100">此时优先级为100
10.本地广播:安全性高,防止携带关键性数据的广播被截获,或是接受垃圾广播。并且,能使广播只在应用程序的内部发出和传递。
主要不同:使用Local Broadcast Manager来对广播进行管理。
onCreate()中 localbroadcastManager = LocalbroadcastManager.getInstance(this);//获取实例
注册和发送广播的时候用的分别是LocalBroadcastManager的registerReceiver()和sendBroadcast()方法。
三、其他
1. 每个app就像孤岛一样,生活在系统分配给自己的虚拟机和内存空间,好处是安全,各个app不会互相影响到对方,IE一个网页的崩溃却会导致整个IE应用程序死亡(举个小栗子,IE不属于跨进程)。在这种情况下,必须有一种机制,提供安全高效的通信的功能,Binder就为此而生。所以,Binder是Android系统的一种IPC(进程间通信)方式。ActivityManagerService、WinderManagerService等系统服务的背后都是Binder。
2. ServiceManager 从名字上看,就是service的管理者,其有独立的进程,会涉及一个问题,server向ServiceManager注册服务,或者client向ServiceManager请求服务,都是跨进程的,也需要进程通信,那binder是如何实现的呢,就是系统启动时,ServiceManager先通过ioctl BINDER_SET_CONTEXT_MGR 创建一个binder实体,这个binder不需要注册,Server向ServiceManager注册自己的服务通过引用号0实现。
3.Binder是一种架构,它提供了服务端接口、Binder驱动、客户端接口三个模块。
4.Toast.makeText(context,"音乐播放结束",Toast.LENGTH_SHORT).show(); 常用的方法。
感悟:- -编程很需要英语功底,感觉有些看不懂得方法查了翻译之后就能懂得大概意思。我们在调用方法的时候,实操需要一个锚点与具体的代码连接,这个锚点可以通过中文建立。