BroadcastReceiver基礎総括

12340 ワード

BroadcastReceiver基礎総括
BroadcastReceiverはAndroidの4つのコンポーネントの1つで、主にシステムや他のプログラムからの放送を受信しています.開発では、起動するとプログラムが開き、ネットワークがあればリソースのダウンロードを開始し、パッケージのインストールやアンインストールを開始し、新しいUIなどに使用されます.以下、このコンポーネントについて自分の理解をまとめます.
BroadcastReceiverのライフサイクル
      BroadcastReceiverのライフサイクルは短く、システムや他のプログラムがブロードキャストを発行すると、Androidシステムのパケット管理オブジェクトは、インストールされているすべてのパケットのプロファイルに一致するactionがあるかどうかをチェックし、受信可能であれば、このBroadcastReceiverを呼び出し、BroadcastReceiverオブジェクトを取得し、onReceiver()を実行します.この時点でBroadcastReceiverオブジェクトはなくなり、破壊され、BroadcastReceiverのライフサイクルは非常に短いと言われています.onReveiver()では時間のかかる操作はできません.そうしないと、ANRダイアログボックスが表示されます.本当に時間のかかる仕事を完成させるなら、サービスに任せて完成させることができます.また、onReceiver()でもサブスレッドで操作することはできませんが、親プロセスが殺されると、そのサブプロセスも殺されるので、安全ではないことはよく知られています.
BroadcastReceiverをアクティブモードで分類
      常駐型ブロードキャスト:Activityのライフサイクルに従って変更されず、Activityが破壊されてもこのBroadcastReceiverはブロードキャストを受け入れることができ、一般的にプロファイルで定義されています.
      非常駐型ブロードキャスト:Activityのライフサイクルによって変化し、プログラムで定義されます.
      どちらを使うのが良いのかは、プログラムのニーズ次第です.たとえば、起動イベントをキャプチャしてパッケージを起動する必要がある場合は、これは常駐型放送が望ましい.たとえば、システムが設定したアプリケーション管理インタフェースでは、新しいUIと一緒にパッケージがインストールされているかどうかをリスニングします.ここでは、非常に駐在型のブロードキャストを使用することが望ましいです.
優先順位別BroadcastReceiver
      秩序化ブロードキャスト:ブロードキャストを受信するときに優先度があり、receiverのandroid:propertyプロパティで優先度が指定され、数値が大きいほど優先度が高くなります.優先度の範囲は[-10001000]ですが、ここでは2点に注意してください.第一に、秩序化されたブロードキャストは、ブロードキャストの継続的な伝送を中断することができ、中断した後、このブロードキャスト受信機に配列された受信機は、ブロードキャストを受信することができず、このブロードキャスト受信機のonReceiver()でabortBroadcast()メソッドを使用するだけでよい.第2に、受信者は、受信中にブロードキャストを受信しようとする受信機にデータを伝達することができ、ここでは、データをBundleで伝達する.コードの説明:
前の受信者はsetResultExtras(Bundle)でデータを格納でき、次の受信者は
Bundle mBundle =getResultExtras(true) ;データを受信します.
      一般放送:これらの放送受信機は放送を受信する時に無秩序で、もちろん、誰もこの放送を中断する権利がありません.受信キューが存在しないからです.
 
コードを見てみましょう.まず、ブロードキャストの登録方法をまとめます.
第1の方法:プロファイルにブロードキャストを登録する(apkパケットがインストールされたブロードキャストを受信する)
まずクラス継承BroadcastReceiverを定義し、onReceiverメソッドを上書きします.
 
package dxd.android.test;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;

public class MyReceiver extends BroadcastReceiver {
	@Override
	public void onReceive(Context context, Intent intent) {
		String action = intent.getAction();
		if(action.equals("android.intent.action.PACKAGE_ADDED")){
			Log.e("MyReceiver","    "+intent.getDataString());
		}
	}
}

 
次に、プロファイルAndroidManifest.xmlファイルにreceiverノードを追加します.
 
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="dxd.android.test"
      android:versionCode="1"
      android:versionName="1.0">
    <uses-sdk android:minSdkVersion="9" />

    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:name=".MyBroadcastReceiverActivity"
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

		<receiver  android:name=".MyReceiver">
			<intent-filter >
				<action android:name="android.intent.action.PACKAGE_ADDED"/>
				<data android:scheme="package" />   
				<!--         --> 
			</intent-filter>
		</receiver>
    </application>
</manifest>

もう1つのプライマリActivityクラスは書かれておらず、このクラスでは受信機を呼び出す方法はまったくありません.
 
第二に、プログラムにブロードキャスト受信機を登録する(apkがインストールされたブロードキャストを受信する)
         先ほどのコードの上には、プライマリActivityに登録を追加してブロードキャスト受信機のコードを解除するだけです.
 
package dxd.android.test;

import android.app.Activity;
import android.content.IntentFilter;
import android.os.Bundle;

public class MyBroadcastReceiverActivity extends Activity {
	MyReceiver receiver = new MyReceiver();
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        IntentFilter filter = new IntentFilter();
        filter.addAction("android.intent.action.PACKAGE_ADDED") ;
        registerReceiver(receiver, filter) ;
    }   
    
    @Override
	protected void onDestroy() {
		unregisterReceiver(receiver) ;
		super.onDestroy();
	}
}

放送なら、この2つの登録方式から逃げられない!コンフィギュレーションファイルに登録された最初のブロードキャストは、Activityのライフサイクルによって制御されず、プログラムに登録された2番目のブロードキャストは非常駐在型ブロードキャストであり、Activityが破壊されると、このブロードキャストはログアウトされることがわかります.ここで、この2つの方式が共通して存在する場合、第2のプログラムに登録されているブロードキャストを基準として説明する.はい、以前は受信したシステムのブロードキャストを例に挙げていましたが、自分で定義したブロードキャストをどのように受信しますか?
 
まず、明日自分がどんな放送を送るべきか、ここでは放送を受けた後、activityにジャンプする例を挙げて、放送は「dxd.android.test.START_ACTIVITY」で、名前は自分で定義します!勝手に修正しますが、一致していなければなりません.まず、BroadcastReceiverから継承されたクラスを書きます.
 
package dxd.android.test;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;

public class DIYReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction() ;
Log.e("DIYReceiver", "action = " + action) ;
if(action.equals("dxd.android.test.START_ACTIVITY")){
Intent intentTo = new Intent(context,NextActivity.class) ;
intentTo.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);//    activity   ,     。
context.startActivity(intentTo) ;
}
}
}

 
次に、プロファイルにreceiverラベルを書きます.
 
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="dxd.android.test"
      android:versionCode="1"
      android:versionName="1.0">
    <uses-sdk android:minSdkVersion="9" />
    
    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:name=".DIYBroadcastReceiverActivity"
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        
        <activity android:name=".NextActivity"></activity>

		<receiver android:name=".DIYReceiver" 
				 
			<intent-filter>
                              <action android:name="dxd.android.test.START_ACTIVITY"/>
			</intent-filter>
		</receiver>
    </application>
</manifest>

 
プログラム内で自分で定義したブロードキャストを送信します.
 
package dxd.android.test;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class DIYBroadcastReceiverActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        Button but = (Button)findViewById(R.id.but);
        
        but.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View v) {
				Intent intent = new Intent(DIYBroadcastReceiverActivity.this ,DIYReceiver.class);
				intent.setAction("dxd.android.test.START_ACTIVITY");
				sendBroadcast(intent);
			}
		});
    }
}

 
DIY BroadcastReceiverActivityページには、ボタンをクリックするとブロードキャストが発行され、ブロードキャスト受信機がブロードキャストを受信すると、ページのジャンプが開始されるボタンが表示されます.
権限のある放送
送信者がブロードキャスト受信機にブロードキャストを受信する権限を要求する場合があるが,この場合どのように定義すればよいのか,実は1つの権限を追加するだけでよいが,ここでは以前のブロードキャストの送信方法とは少し通じない.コードを見る
 
package dxd.android.test;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class DIYBroadcastReceiverActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        Button but = (Button)findViewById(R.id.but);
        
        but.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View v) {
				Intent intent = new Intent(DIYBroadcastReceiverActivity.this ,DIYReceiver.class);
				intent.setAction("dxd.android.test.START_ACTIVITY");
				sendBroadcast(intent,"dxd.android.test.permission.receiver");//             
			}
		});
    }

	@Override
	protected void onDestroy() {
		super.onDestroy();
	}
    
    
}

 
自分が書いたReceiverはほとんど前と同じです
 
public class DIYReceiver extends BroadcastReceiver {
	@Override
	public void onReceive(Context context, Intent intent) {
		String action = intent.getAction() ;
		Log.e("DIYReceiver", "action = " + action) ;
		if(action.equals("dxd.android.test.START_ACTIVITY")){
			Intent intentTo = new Intent(context,NextActivity.class) ;
			intentTo.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);//    activity   ,     。
			context.startActivity(intentTo) ;
		}
	}
}

主にプロファイルを参照
 
 
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="dxd.android.test"
      android:versionCode="1"
      android:versionName="1.0">
    <uses-sdk android:minSdkVersion="9" />
    
    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:name=".DIYBroadcastReceiverActivity"
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        
        <activity android:name=".NextActivity"></activity>

		<receiver android:name=".DIYReceiver" >
			<intent-filter>
				<action android:name="dxd.android.test.START_ACTIVITY"/>
			</intent-filter>
		
		</receiver>
		
    </application>
     
    <permission android:name="dxd.android.test.permission.receiver"></permission>
    <uses-permission android:name="dxd.android.test.permission.receiver"/>
</manifest>

総合的に判断するとsendBroadcast(intent,permission)と、プロファイルに権限を追加した宣言と、この権限を追加します!
 
ここまで、粘性放送だけはまとめていません.後ではっきりしてから書きます.