AndroidでのLocalBroadcastManagerの使い方
6022 ワード
AndroidのBroadcastReceiverの主な用途は
通知の送信、UIまたはデータの更新、アプリケーション間の相互通信、システムステータスのリスニング(電源投入、ネットワークなど)
AndroidでのBroadcasetReceiverの登録方式 manifestインベントリファイルのグローバル登録 ライフサイクルに従って、サービスまたはActivityでコード登録 を使用します.
manifestの登録方式
コード登録の使用
SampleActivity
Androidで放送する方法
一般ブロードキャスト:優先度の大きさにかかわらず、すべてのリスニングAction=「com.test.sample.action」のブロードキャストに送信されます.コンテンツは変更できません.伝達性はありません.
非同期(粘性)放送:処理後のIntentは、依然として存在し、registerReceiver(BroadcastReceiver、IntentFilter)は、それを削除するまで、伝達性がなく、放送を終了できない値を受け取ることができます.
このブロードキャストを送信するには権限が必要です
削除はこの方法でremoveStickyBroadcast(intent);しかし、この方法を実行するアプリケーションの中でAndroidManifestを忘れないでください.xmlは同様に上の権限を加えなければならない.
秩序化されたブロードキャスト:
受信者の優先度順にブロードキャストを受信すると、優先度はintent-filterのpriorityで-1000から1000の間で、値が大きいほど優先度が高くなると宣言されます.放送意図の継続的な伝播を終了することができ、受信者はコンテンツを改ざんすることができ、伝達性がある.
AndroidのBroadcastReceiverは、プログラムまたはプロセス間の通行を実現するために別のブロードキャストに情報を送信するために使用することができる.
Androidの放送例を振り返ると、全体的にセキュリティがよくないため、セキュリティの低いデータ転送やページ更新にのみ適用されます.
android-support-v 4.JArにはローカル通知マネージャと呼ばれるLocalBroadcastManagerが導入されています.この通知の利点は、セキュリティが高く、効率も高く、ローカル通信に適しており、Handlerの代わりにUIを更新できることです.
通知の送信、UIまたはデータの更新、アプリケーション間の相互通信、システムステータスのリスニング(電源投入、ネットワークなど)
AndroidでのBroadcasetReceiverの登録方式
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;
}
}
}