前几天刚写了一个短信拦截程序,该程序放在虚拟机或是原生态的android中测试是可以拦截到短信的,但是在真机中却始终拦截不了。
查了下原因,主要是真机中系统有其特有的短信拦截程序,要让自己的程序优先与系统程序拦截短信,这就要让自己的程序优先级设置为最高。
网上很多地方说只需要把android:priority设置为1000就是最高优先级,其实不然,android:priority的最大值不是1000,而是Integer的最大值即2147483647,所以注册的接收器应该为:
<receiver android:name="com.android.ars.GetInfoReceiver">
<intent-filter android:priority="2147483647">
<action android:name="android.provider.Telephony.SMS_RECEIVED"/>
</intent-filter>
</receiver>
然而动态注册的优先级和静态注册的优先级相比呢?
答案是动态注册的优先级会比静态注册的优先级高,应该说动态注册的优先级会永远比静态注册的优先级高。
所以,短信接收器还得动态注册下。在动态注册优先级同等条件下,先动态注册的优先级高。为了让程序的优先级最高,可让程序设置为开机启动,然后在开机启动的服务中注册短信接收器,即在开机服务的onCreate方法中注册。
public void onCreate(){
super.onCreate();
IntentFilter intent = new IntentFilter();
intent.addAction("android.provider.Telephony.SMS_RECEIVED");
intent.setPriority(2147483647);
this.registerReceiver(new GetInfoReceiver(), intent);
}
在开机启动的过程中,注册广播也有先后顺序,这与程序的包名有关,具体可见—— android 抢先开机启动程序
如果完成以上操作,这样只能让程序优先于第三方软件,不能优先于系统拦截短信软件,如果为了自己的程序优先于系统拦截短信,可将自己的程序改为系统程序。