android知識回顧---4大組件之broadcast廣播

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內與之相匹配的有效廣播接收器中。
 3.有序廣播和無序廣播

普通廣播:通過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屬性的話,先註冊的將先收到廣播。

有序廣播,即從優先級別最高的廣播接收器開始接收,接收完了如果沒有丟棄,就下傳給下一個次高優先級別的廣播接收器進行處理,依次類推,直到最後。如果多個應用程序設置的優先級別相同,則誰先註冊的廣播,誰就可以優先接收到廣播。

這裏接收短信的廣播是有序廣播,因此可以設置你自己的廣播接收器的級別高於系統原來的級別,就可以攔截短信,並且不存收件箱,也不會有來信提示音。






發佈了146 篇原創文章 · 獲贊 23 · 訪問量 19萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章