1.自启动
需要获取自启动权限:
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
这个权限在4.0以后必须需要。否则无法获取到广播。
然后我们在广播中获取这个通知,然后进行相应的操作:
1 package com.example.com.mac.bootdeme; 2 3 import android.app.Service; 4 import android.content.Intent; 5 import android.os.IBinder; 6 import android.util.Log; 7 8 public class BootService extends Service { 9 String Tag = "BootService"; 10 11 @Override 12 public void onCreate() { 13 // TODO Auto-generated method stub 14 Log.i(Tag, "onCreate"); 15 super.onCreate(); 16 } 17 18 @Override 19 public int onStartCommand(Intent intent, int flags, int startId) { 20 // TODO Auto-generated method stub 21 Log.i(Tag, "onStartCommand"); 22 new Thread(new Runnable() { 23 24 @Override 25 public void run() { 26 // TODO Auto-generated method stub 27 while (true) { 28 Log.i(Tag, "执行Service Action"); 29 try { 30 Thread.sleep(1000); 31 } catch (InterruptedException e) { 32 // TODO Auto-generated catch block 33 e.printStackTrace(); 34 } 35 } 36 } 37 }).start(); 38 return START_STICKY; 39 } 40 41 @Override 42 public IBinder onBind(Intent intent) { 43 // TODO Auto-generated method stub 44 Log.i(Tag, "onBind"); 45 return null; 46 } 47 48 @Override 49 public void onDestroy() { 50 // TODO Auto-generated method stub 51 Log.i(Tag, "onDestroy"); 52 super.onDestroy(); 53 } 54 }
下面我来谈谈这个自启动出现的问题:
a).手机差异,比如:我的小米手机无法获取到通知,需要在权限控制中进行设置。
但是不知道为什么微信和QQ在安装上以后默认会有自启动权限,我怀疑是跟各厂商进行合作开放了自启动接口。小米v5默认是在启动后不会给app接收到广播的。这个如果有哪位高手知道的请告诉我。
b).关于Service一直保存
START_STICKY:如果service进程被kill掉,保留service的状态为开始状态,但不保留递送的intent对象。随后系统会尝试重新创建service,由于服务状态为开始状态,所以创建服务后一定会调用onStartCommand(Intent,int,int)方法。如果在此期间没有任何启动命令被传递到service,那么参数Intent将为null。
START_NOT_STICKY:“非粘性的”。使用这个返回值时,如果在执行完onStartCommand后,服务被异常kill掉,系统不会自动重启该服务。
START_REDELIVER_INTENT:重传Intent。使用这个返回值时,如果在执行完onStartCommand后,服务被异常kill掉,系统会自动重启该服务,并将Intent的值传入。
START_STICKY_COMPATIBILITY:START_STICKY的兼容版本,但不保证服务被kill后一定能重启。
2.关于一个App多个进程
相关配置 android:process="XXX"
<service android:name="com.example.com.mac.bootdeme.BootService" android:process="com.example.com.mac.bootdeme.BootService" > </service>
默认情况下android中所有的组件都随包名走,所以只会在Setting中出现一个进程一个服务。如果想让某一个组件单出来,那么android:process 配置成和包名不一样的,就会是另一个进程,那么就会出现类似微信和支付宝这样的现象。