AndroidでのLocalBroadcastManagerの使い方

6022 ワード

AndroidのBroadcastReceiverの主な用途は
通知の送信、UIまたはデータの更新、アプリケーション間の相互通信、システムステータスのリスニング(電源投入、ネットワークなど)
AndroidでのBroadcasetReceiverの登録方式
  • manifestインベントリファイルのグローバル登録
  • ライフサイクルに従って、サービスまたはActivityでコード登録
  • を使用します.
    manifestの登録方式
     <receiver android:name="com.sample.test.MyBroadcastReciever">  
                <intent-filter>  
                    <action android:name="com.sample.test.ACTION_DO_SOMETHING"></action>
                    <action android:name="android.intent.ACTION_WIFI_STATE_CHANGED"></action>  
                </intent-filter>  
      </receiver>

    コード登録の使用
    SampleActivity
    private  MyReceiver receiver;
    
    @Override 
    public void onStart() {
          super.onStart();  
        receiver = new MyReceiver();
        IntentFilter filter = new IntentFilter();
        filter.addAction("android.intent.action.MY_BROADCAST");
        registerReceiver(receiver, filter);
    }
    @Override
    public void onStop(){
        super.onStop();
        unregisterReceiver(receiver);  
    }

    Androidで放送する方法
    一般ブロードキャスト:優先度の大きさにかかわらず、すべてのリスニングAction=「com.test.sample.action」のブロードキャストに送信されます.コンテンツは変更できません.伝達性はありません.
    Intent intent = new Intent( "com.test.sample.action");
    sendBroadcast(intent);

    非同期(粘性)放送:処理後のIntentは、依然として存在し、registerReceiver(BroadcastReceiver、IntentFilter)は、それを削除するまで、伝達性がなく、放送を終了できない値を受け取ることができます.
    このブロードキャストを送信するには権限が必要です
    削除はこの方法でremoveStickyBroadcast(intent);しかし、この方法を実行するアプリケーションの中でAndroidManifestを忘れないでください.xmlは同様に上の権限を加えなければならない.
    sendStickyOrderedBroadcast(intent, resultReceiver, scheduler,
           initialCode, initialData, initialExtras)

    秩序化されたブロードキャスト:
    受信者の優先度順にブロードキャストを受信すると、優先度はintent-filterのpriorityで-1000から1000の間で、値が大きいほど優先度が高くなると宣言されます.放送意図の継続的な伝播を終了することができ、受信者はコンテンツを改ざんすることができ、伝達性がある.
    sendBroadcast(intent);

    AndroidのBroadcastReceiverは、プログラムまたはプロセス間の通行を実現するために別のブロードキャストに情報を送信するために使用することができる.
    Androidの放送例を振り返ると、全体的にセキュリティがよくないため、セキュリティの低いデータ転送やページ更新にのみ適用されます.
    android-support-v 4.JArにはローカル通知マネージャと呼ばれるLocalBroadcastManagerが導入されています.この通知の利点は、セキュリティが高く、効率も高く、ローカル通信に適しており、Handlerの代わりにUIを更新できることです.
    public class LocalServiceBroadcasterActivity extends Activity {
    	static final String ACTION_STARTED = "com.example.android.supportv4.STARTED";
    	static final String ACTION_UPDATE = "com.example.android.supportv4.UPDATE";
    	static final String ACTION_STOPPED = "com.example.android.supportv4.STOPPED";
    
    	LocalBroadcastManager mLocalBroadcastManager;
    	BroadcastReceiver mReceiver;
    
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    
    		setContentView(R.layout.main);
    
    		final TextView callbackData = (TextView) findViewById(R.id.callback);
    		callbackData.setText("No broadcast received yet");
    		mLocalBroadcastManager = LocalBroadcastManager.getInstance(this);
    
    		IntentFilter filter = new IntentFilter();
    		filter.addAction(ACTION_STARTED);
    		filter.addAction(ACTION_UPDATE);
    		filter.addAction(ACTION_STOPPED);
    		
    		mReceiver = new BroadcastReceiver() {
    			@Override
    			public void onReceive(Context context, Intent intent) {
    				if (intent.getAction().equals(ACTION_STARTED)) {
    					callbackData.setText("STARTED");
    				} else if (intent.getAction().equals(ACTION_UPDATE)) {
    					callbackData.setText("Got update: " + intent.getIntExtra("value", 0));
    				} else if (intent.getAction().equals(ACTION_STOPPED)) {
    					callbackData.setText("STOPPED");
    				}
    			}
    		};
    		mLocalBroadcastManager.registerReceiver(mReceiver, filter);
    
    		
    		Button button = (Button) findViewById(R.id.start);
    		button.setOnClickListener(mStartListener);
    		button = (Button) findViewById(R.id.stop);
    		button.setOnClickListener(mStopListener);
    	}
    
    	@Override
    	protected void onDestroy() {
    		super.onDestroy();
    		mLocalBroadcastManager.unregisterReceiver(mReceiver);
    	}
    
    	private OnClickListener mStartListener = new OnClickListener() {
    		public void onClick(View v) {
    			startService(new Intent(LocalServiceBroadcasterActivity.this, LocalService.class));
    		}
    	};
    
    	private OnClickListener mStopListener = new OnClickListener() {
    		public void onClick(View v) {
    			stopService(new Intent(LocalServiceBroadcasterActivity.this, LocalService.class));
    		}
    	};
    
    	public static class LocalService extends Service {
    		LocalBroadcastManager mLocalBroadcastManager;
    		int mCurUpdate;
    
    		static final int MSG_UPDATE = 1;
    
    		Handler mHandler = new Handler() {
    			@Override
    			public void handleMessage(Message msg) {
    				switch (msg.what) {
    				case MSG_UPDATE: {
    					mCurUpdate++;
    					Intent intent = new Intent(ACTION_UPDATE);
    					intent.putExtra("value", mCurUpdate);
    					mLocalBroadcastManager.sendBroadcast(intent);
    					Message nmsg = mHandler.obtainMessage(MSG_UPDATE);
    					mHandler.sendMessageDelayed(nmsg, 1000);
    				}
    					break;
    				default:
    					super.handleMessage(msg);
    				}
    			}
    		};
    
    		@Override
    		public void onCreate() {
    			super.onCreate();
    			mLocalBroadcastManager = LocalBroadcastManager.getInstance(this);
    		}
    
    		public int onStartCommand(Intent intent, int flags, int startId) {
    			// Tell any local interested parties about the start.
    			mLocalBroadcastManager.sendBroadcast(new Intent(ACTION_STARTED));
    
    			// Prepare to do update reports.
    			mHandler.removeMessages(MSG_UPDATE);
    			Message msg = mHandler.obtainMessage(MSG_UPDATE);
    			mHandler.sendMessageDelayed(msg, 1000);
    			return ServiceCompat.START_STICKY;
    		}
    
    		@Override
    		public void onDestroy() {
    			super.onDestroy();
    
    			// Tell any local interested parties about the stop.
    			mLocalBroadcastManager.sendBroadcast(new Intent(ACTION_STOPPED));
    
    			// Stop doing updates.
    			mHandler.removeMessages(MSG_UPDATE);
    		}
    
    		@Override
    		public IBinder onBind(Intent intent) {
    			return null;
    		}
    	}
    }