Android粘性放送StickyBroadcastの使用


Android放送の分類:
1、一般放送:この放送は各プロセッサに順次に伝達して処理することができる
2、秩序放送:このような放送はプロセッサ側での処理順序はプロセッサの異なる優先度によって区別され、高優先度のプロセッサはこのメッセージを優先的にキャプチャし、このメッセージを削除することができる
3、スティッキーメッセージ:スティッキーメッセージは送信後ずっとシステムのメッセージコンテナの中に存在し、対応するプロセッサが処理するのを待っています.このメッセージを一時的にプロセッサが処理していなければ、メッセージコンテナの中でずっと待っています.スティッキーブロードキャストのReceiverが破棄されると、次回の再構築時に自動的にメッセージデータが受信されます.
注意:通常のブロードキャストとスティッキー・メッセージは異なり、秩序化されたブロードキャストはキャプチャすることができる.
Androidシステムのスティッキーブロードキャストでは、一般的に重要な状態が変化した後の情報が永続的に保存され、電源の変化などの新しいブロードキャスト受信機にいつでもブロードキャストできるようになります.消費電力にはプロセスが必要です.前のプロセスは事前に取得しなければなりません.そうしないと、次のちょうど受信したブロードキャスト後にシステムが自動的に電源を切ってしまう可能性があります.それに伴ってkill行為が行われるので、処理されていないタスクにとっては、結果は深刻だ.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
スティッキーブロードキャストを送信するには権限が必要です(ここでの権限は、情報を保存する権限と、システムによって未処理のブロードキャストを送信する権限です).

粘性放送の送信については、通常放送の送信方式と一致する.スティッキーブロードキャストの正しい使い方をテストするには、stick Broadcastを送信するためにSenderActivityを定義する必要があります.
public class SenderActivity{

@Override
protected void onCreate(Bundle saveInstance) {
    super.onCreate(saveInstance);
    setContentView(R.layout.stcik_test_layout);
    getWindow().setBackgroundDrawableResource(R.drawable.avatar11);
}

@Override
protected void onResume() {
    super.onResume();
getWindow().getDecorView().postDelayed(new Runnable() {

    @Override
        public void run() {
     sendStickyBroadcast();
      }
    }, 3*1000);
}

private void sendStickyBroadcast()
{
    Intent i = new Intent();
    i.setAction(StickyBroadcastReceiver.Action);
    i.putExtra("info", "sticky broadcast has been receiver");
    sendStickyBroadcast(i);
    Log.i("Other","sticky broadcast send ok!");
}

}

粘性放送は通常放送の一種であることが知られているので、通常放送受信機を用いて受信することもでき、もちろん粘性放送にはもう一つの一般的な受信方式がある.
1.通常のブロードキャスト受信機を使用して、Manifiestまたは送信前に受信する必要があることに注意する(これは、この方法が正しい受信方法ではないため、定義とは少し異なる)
public class StickyBroadcastReceiver extends BroadcastReceiver {

    public static final String Action = "com.sample.test.sticky.broadcast.receiver";
    public static final String PERMISSION = "com.sample.test.permission.sticky.receiver";
    @Override
    public void onReceive(Context context, Intent intent)
    {
        int checkCallingOrSelfPermission = context.checkCallingOrSelfPermission(PERMISSION);
        if(PackageManager.PERMISSION_GRANTED == checkCallingOrSelfPermission) //    
        {
            Toast.makeText(context, "    ", Toast.LENGTH_SHORT).show();
        }else{
            Toast.makeText(context, "    ", Toast.LENGTH_SHORT).show();
            throw new RuntimeException("permission denied");
        }
        if(intent!=null&&Action.equals(intent.getAction()))
        {
            Toast.makeText(context, intent.getStringExtra("info"), Toast.LENGTH_SHORT).show();
        }
    }

}

Mainifest.xml










    
    
         
    

2.正しい方法で受け取る(推奨)
正しい受信方式はBroadcastReceiverで受信できるものではない
SenderActivityのonResumeを少しだけ変更するだけです
@Override
protected void onResume() {
    super.onResume();
//3    
 getWindow().getDecorView().postDelayed(new Runnable() {

    @Override
        public void run()
         {
         sendStickyBroadcast();
      }
    }, 3*1000);

//15    
getWindow().getDecorView().postDelayed(new Runnable() {

    @Override
    public void run()
    {
        IntentFilter intentFilter = new IntentFilter(StickyBroadcastReceiver.Action);
        Intent data = registerReceiver(null, intentFilter);
        if(data!=null&&StickyBroadcastReceiver.Action.equals(data.getAction()))
        {
            Toast.makeText(this, data.getStringExtra("info"), Toast.LENGTH_SHORT).show();
        }
    }
    }, 15*1000);
}

このような10秒程度の時間帯【先送信、後受信】では、粘性放送の情報が完全に保存されていることを説明し、以下のようにすれば、取得でき、かつ無制限に取得できる.
 Intent data = registerReceiver(null, intentFilter); //  ,      ,         

注記:このようなブロードキャストも削除できます.ブロードキャストを受信してremoveStickyBroadcast(intent)を呼び出すことができます.
変換元:http://www.codeweblog.com/android-%E7%B2%98%E6%80%A7%E5%B9%BF%E6%92%ADstickybroadcast%E7%9A%84%E4%BD%BF%E7%94%A8/