Android之BroadcastReceiver权限设置
[TOC]
概述比如在当前 Activity 下动态注册一个广播,我们会这样做:
1this.registerReceiver(receiver, filter)
这样的话,这个 receiver 组件是完全公开的,不仅仅我们的应用可以向它发送数据,外部应用也可以指定相应的 action 来向它发送恶意数据。
为了提高安全性,则需要对其进行权限限制,有两种措施:
方案一1registerReceiver(BroadcastReceiver receiver, IntentFilter filter, String broadcastPermission, Handler scheduler)
该方法还是允许接收外部的广播,但添加了权限来进行限制。
在动态注册中的代码
123456BroadcastReceiver receiver = new MyBroadcastReceiver();Handler handler = new MyHandler();IntentFilter filter = new IntentFilter();filter.addAction("m ...
Android Service详解之StartService启动
[TOC]
文章参考:https://blog.csdn.net/SuperBigLw/article/details/53115705
一丶概述启动服务由另一个组件通过调用 startService() 启动,这会导致调用服务的 onStartCommand() 方法。
服务启动之后,其生命周期即独立于启动它的组件,并且可以在后台无限期地运行,即使启动服务的组件已被销毁也不受影响。 因此,服务应通过调用 stopSelf() 结束工作来自行停止运行,或者由另一个组件通过调用 stopService() 来停止它。
应用组件(如 Activity)可以通过调用 startService() 方法并传递 Intent 对象(指定服务并包含待使用服务的所有数据)来启动服务。服务通过 onStartCommand() 方法接收此 Intent。
例如,假设某 Activity 需要将一些数据保存到在线数据库中。该 Activity 可以启动一个协同服务,并通过向 startService() 传递一个 Intent,为该服务提供要保存的数据。服务通过 onStartCommand() 接收 ...
Android Service详解之Service概述
[TOC]
文章转自:https://blog.csdn.net/SuperBigLw/article/details/53115705
概述Service 是一个可以在后台执行长时间运行操作而不提供用户界面的应用组件。服务可由其他应用组件启动,而且即使用户切换到其他应用,服务仍将在后台继续运行。 此外,组件可以绑定到服务,以与之进行交互,甚至是执行进程间通信 (IPC)。 例如,服务可以处理网络事务、播放音乐,执行文件 I/O 或与内容提供程序交互,而所有这一切均可在后台进行。
Service的用途Service可以在很多场合的应用中使用,比如播放多媒体的时候用户启动了其他Activity,这个时候程序要在后台继续播放;比如检测SD卡上文件的变化;再或者在后台记录用户的地理信息位置的改变;或者启动一个服务来运行并一直监听某种动作等等。
Service概念的总结1、Service在后台运行,不可以与用户直接交互;
2、一个服务不是一个单独的进程。服务对象本身并不意味着它是在自己的进程中运行,除非另有规定,否则它与运行程序是同在一个进程中
3、一个服务不是一个单独的线程。Ser ...
Android Service使用场景之保活机制的实现
[TOC]
Service系统机制机制拉活
这种系统拉活机制没有保证
账号同步拉活谷歌官方允许的拉活的方式
通过JobScheduler进行拉活App这种方式不建议使用,因为比较耗内存
双进程守护
这种方式,会在低电量模式下会被双杀。
Android Service详解之IntentService学习
[TOC]
文章参考:https://blog.csdn.net/SuperBigLw/article/details/53126101
一:概述很多时候,我们开启一个Service是想执行一个耗时任务。初学者可能直接就在Service里面执行耗时任务。这是非常不可取的。不管是何种Service,它默认都是在应用程序的主线程(亦即UI线程)中运行的。所以,如果你的Service将要运行非常耗时或者可能被阻塞的操作时,你的应用程序将会被挂起,甚至会出现ANR错误。为了避免这一问题,你应该在Service中重新启动一个新的线程来进行这些操作。现有两种方法大家参考:
1、 直接在Service的onStartCommand()方法中新建一个线程来执行;
2、Android SDK 中为我们提供了一个现成的Service类来实现这个功能,它就是IntentService,它主要负责以下几个方面:
1234567891011121314151617181920Creates a default worker thread that executes all intents delivered t ...
绑定服务BindService详解
[TOC]
文章参考:https://blog.csdn.net/SuperBigLw/article/details/53126676
文章参考:https://www.heqiangfly.com/2015/12/20/android-knowledge-about-service/
一、概述绑定服务是客户端-服务器接口中的服务器。绑定服务可让组件(例如 Activity)绑定到服务、发送请求、接收响应,甚至执行进程间通信 (IPC)。 绑定服务通常只在为其他应用组件服务时处于活动状态,不会无限期在后台运行。
二、实现原理应用程序组件(客户端)通过调用bindService()方法能够绑定服务,然后Android系统会调用服务的onBind()回调方法,这个方法会返回一个跟服务端交互的IBinder对象。这个绑定是异步的,bindService()方法立即返回,并且不给客户端返回IBinder对象。要接收IBinder对象,客户端必须穿件一个ServiceConnection类的实例,并且把这个实例传递给bindService()方法。ServiceCOnnection对象包含了一 ...
Android Service详解之BoundService中AIDL的使用
[TOC]
文章参考:https://blog.csdn.net/SuperBigLw/article/details/53156177
AIDL介绍AIDL(Android Interface Definition Language)安卓接口定义语言
使用场景如果将Service变成远程Service的话,使用扩展的Binder进行通信会报错:这是由于在Bind Service按钮的点击事件里面我们会让MainActivity和MyService建立关联,但是目前MyService已经是一个远程Service了,Activity和Service运行在两个不同的进程当中,这时就不能再使用传统的建立关联的方式,程序也就崩溃了。
那么如何才能让Activity与一个远程Service建立关联呢?这就要使用AIDL来进行跨进程通信了(IPC)。
使用步骤1.创建一个服务重写这四个方法
1234567891011121314151617181920@Overridepublic void onCreate() { super.onCreate();} @Overrid ...
Android解决5.0以上不支持隐式启动服务的问题
[TOC]
Android5.0以上不支持隐式启动服务,有常用的两种解决办法。
将隐式启动转换为显式启动,兼容编译sdk5.0以后版本12context.bindService(getExplicitIntent(mContext,new Intent(GPSBOARDCONTROL)), serviceConnection, Context.BIND_AUTO_CREATE);
12345678910111213141516//将隐式启动转换为显式启动,兼容编译sdk5.0以后版本 public Intent getExplicitIntent(Context context,Intent implicitIntent){ PackageManager pm = context.getPackageManager(); List<ResolveInfo> resolveInfos = pm.queryIntentServices(implicitIntent, 0); if (resolveInfo ...
Context.startForegroundService异常
[TOC]
文章参考:https://blog.csdn.net/sinat_20059415/article/details/80584487
文章参考:https://blog.csdn.net/lylddinghffw/article/details/78219327
https://blog.csdn.net/lylddinghffw/article/details/80366791
文章参考:https://www.cnblogs.com/wangqiang9/p/10595417.html
源码分析:https://blog.csdn.net/lylddinghffw/article/details/80366791
前言:最近在处理Android O的应用crash和anr问题,其中遇到比较多的就是“Context.startForegroundService() did not then call Service.startForeground()”,将自己的处理心得总结回顾一下。
线上出现一个问题:
1234567891011121314151617181920212 ...
Android Service详解之Messenger双向通信的实现
[TOC]
文章参考:https://blog.csdn.net/SuperBigLw/article/details/53158164
一、概述Messenger实现IPC通信,底层也是使用了AIDL方式。和AIDL方式不同的是, Messenger方式是利用Handler形式处理,因此,它是线程安全的,这也表示它不支持并发处理;而AIDL方式是非线程安全的,支持并发处理,因此,我们使用,AIDL方式时需要保证代码的线程安全。大部分情况下, 我们应用中不需要并发处理。 因此, 我们通常只需要使用Messenger方式。思想:在进程A中创建一个Message,将这个Message对象通过Messenger.send(message)方法传递到进程B(当然, Message对象本身是无法被传递到进程B的, send(message)方法会使用一个Parcel对象对Message对象编集,再将Parcel对象传递到进程B中,然后解编集,得到一个和进程,A中Message对象内容一样的对象) ,再把Message对象加入到进程B的消息队列里, Handler会去处理它。
二、具体步骤,双向通 ...