1.怎麼可以讓自定義的廣播被指定app接收
思路就是自定義廣播設置權限,接收的權限,只有指定的app的接收者纔可以接收,其實activity service broadcast都是一樣的,如果不設置這樣的權限,在android系統中都是可以通過api或者指令去啓用activity。簡單思路:
首先接收者需要在 xml文件中註冊廣播,需要自定義權限<permission name="com.fox.aav"> <uses-permission name="com.fox.aav" />
然後註冊的廣播的時候加上這個權限。
接下來是發送廣播的時候 sendbroadcast(intent,"com.fox.aav") 指定權限 發送
發送廣播:
package com.tt.test; import android.app.Activity; import android.content.ComponentName; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.widget.Button; public class Main extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); ((Button)findViewById(R.id.button)).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent i = new Intent("COM.MESSAGE"); i.addCategory("receiver"); i.putExtra("message", "haha"); sendOrderedBroadcast(i, "com.fox.aav"); } }); } }AndroidManifest.xml:
<uses-permission android:name="com.fox.aav" ></uses-permission> <permission android:protectionLevel="normal" android:name="com.fox.aav"></permission>
接收廣播:
package com.tt.receiver; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.util.Log; public class Receiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Log.d("TAG", "receiver intent:" + intent.toString()); } }AndroidManifest.xml
<uses-permission android:name="com.fox.aav" ></uses-permission>
<receiver android:name=".Receiver" android:permission="com.fox.aav"> <intent-filter> <action android:name="COM.MESSAGE" /> <category android:name="receiver" /> </intent-filter> </receiver>
2.增加廣播的安全性
- 對於同一App內部發送和接收廣播,將exported屬性人爲設置成false,使得非本App內部發出的此廣播不被接收;
- 在廣播發送和接收時,都增加上相應的permission,用於權限驗證;
- 發送廣播時,指定特定廣播接收器所在的包名,具體是通過intent.setPackage(packageName)指定,這樣此廣播將只會發送到此包中的App內與之相匹配的有效廣播接收器中。
普通廣播:通過Context.sendBroadcast()方法來發送,它是完全異步的。所有的receivers(接收器)的執行順序不確定,因此所有的receivers(接收器)接收broadcast的順序不確定。這種方式效率更高,但是BroadcastReceiver無法使用setResult系列、getResult系列及abort(中止)系列API有序廣播:是通過Context.sendOrderedBroadcast來發送,所有的receiver依次執行。BroadcastReceiver可以使用setResult系列函數來結果傳給下一個BroadcastReceiver,通過getResult系列函數來取得上個BroadcastReceiver返回的結果,並可以abort系列函數來讓系統丟棄該廣播,使用該廣播不再傳送到別的BroadcastReceiver。可以通過在intent-filter中設置android:priority屬性來設置receiver的優先級,優先級相同的receiver其執行順序不確定。如果BroadcastReceiver是代碼中註冊的話,且其intent-filter擁有相同android:priority屬性的話,先註冊的將先收到廣播。有序廣播,即從優先級別最高的廣播接收器開始接收,接收完了如果沒有丟棄,就下傳給下一個次高優先級別的廣播接收器進行處理,依次類推,直到最後。如果多個應用程序設置的優先級別相同,則誰先註冊的廣播,誰就可以優先接收到廣播。
這裏接收短信的廣播是有序廣播,因此可以設置你自己的廣播接收器的級別高於系統原來的級別,就可以攔截短信,並且不存收件箱,也不會有來信提示音。