放送受信機Pao Ding Jie Niu


このセクションの紹介:

前のセクションで、BroadcastReceiver についてはすでに予備的に理解しており、標準とオーダードの 2 つのブロードキャスト タイプについて理解していました。 ブロードキャスト レシーバーを動的または静的に登録し、システム ブロードキャストをリッスンし、自分でブロードキャストを送信します。私たちの基本的なニーズは満たされました~ ただし、上に書かれた放送はすべてグローバル放送です。これは、APP によって送信されたブロードキャストが他の APP によって受信されることも意味します。 または、他のアプリによって送信されたブロードキャストも当社のアプリで受信されるため、セキュリティ上の問題が簡単に発生する可能性があります。そして Android はローカル ブロードキャスト メカニズムを提供します。このメカニズムを使用して発行されたブロードキャストは APP 内でのみ伝播されます。 ブロードキャスト受信機は、このアプリケーションによって送信されたブロードキャストのみを受信できます。


1. ローカルブロードキャスト

1) コアの使用法:

1.png

PS: ローカルブロードキャストは、システムグローバルブロードキャストと比較してより効率的です

2) 注:

2.png

3) コード例 (別の場所でログインしてユーザーをオフラインにする):

WeChat と同様に、WeChat を実行すると、別の携帯電話を使用してアカウントに再度ログインすると、以前の携帯電話がアカウントにリマインドされます。 このように別のターミナルにログインし、開いたアクティビティをすべて閉じて、次のようにログイン ページに戻ります~
以下に簡単な例を書いてみましょう:

レンダリングの実行:

3.gif

コードの実装:

ステップ 1: すべてのアクティビティを閉じる ActivityCollector を準備します。ここでは、前の Activity によって提供されたものを使用しました。

public class ActivityCollector {
private static List<Activity> activity = new ArrayList<Activity>();
public static void addActivity(Activity activity) {
activities.add(activity);
}
public static void removeActivity(Activity activity) {
activities.re移動(アクティビティ);
}
public static void finishAll() {
for (Activity activity : activities) {
if (!activity.isFinishing()) {
activity.finish();
}
}
}
}

ステップ 2 :先写要给简单的BaseActivity,用来继承,次写下登陆界面!

public class BaseActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ActivityCollector .addActivity(this);
}

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

LoginActivity.java:


public class LoginActivity extends BaseActivity implements View.OnClickListener{


private SharedPreferences pref;
private SharedPreferences.Editor editor;

private EditText edit_user;
private EditText edit _pawd;
private Button btn_login;


@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
pref = PreferenceManager.getDefaultSharedPreferences(this);

bindViews();
}

private void bindViews() {
edi​​t_user = (EditText) findViewById(R.id.edit_user);
edi​​t_pawd = (EditText) findViewById(R.id.edit_pawd);
btn_login = (ボタン) findViewById(R.id.bt) n_login);
btn_login.setOnClickListener( this);
}

@Override
protected void onStart() {
super.onStart();
if(!pref.getString("user","").equals("")){
edi​​t_user.setText (pref.getString("user",""));
edi​​t_pawd.setText(pref.getString("pawd",""));
}
}

@Override
public void onClick(View v) {
String user = edit_user.getText().toString();
String pawd = edit_pawd.getText().toString();
if(user.equals("123")&&pawd.equals("123")){
エディター= pref.edit();
edi​​tor.putString("user", user);
editor.putstring( "pawd"、pawd);
editor.commit(); : オーバーライド
public void onReceive(final Context context, Intent Intent) {
AlertDialog.Builder ダイアログビルダー = new AlertDialog.Builder(context);
DialogBu​​ilder.setTitle("警告:");
dia logBu​​ilder.setMessage("あなたのアカウントは他の場所でログインしてください、ログインしてください ~ ");
DialogBu​​ilder.setcanceLable (false);
Dialogbuilder.setpositiveButton (" OK ",
New Dialoginterface.onClicklistener () Errideb Public Void Onclick (Dialoginterface Dialog, Int Which) {
ActivityCollector. finishall();
                        tent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);
}
});
AlertDialog alertDialog = dialogBu​​ilder.create();
alertDialog.getWindow().setType(
WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
alertDialog.show();
}
}


AndroidManifest にシステム ダイアログ権限を追加することを忘れないでください。localBroadcastManager をインスタンス化し、それを使用して関連する操作を完了し、さらに破棄します。 レシーバーの登録解除に注意してください。

MainActivity.java

public class MainActivity extends BaseActivity {

private MyBcReceiver localReceiver;
private LocalBroadcastManager localBroadcastManager;
private IntentFilter intentFilter;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R. layout.activity_main);
localBroadcastManager = LocalBroadcastManager.getInstance(this);

//初化广播受信者、设置过滤器
localReceiver = new MyBcReceiver();
intentFilter = new IntentFilter();
intentFilter.addAction("com .jay.mybcreceiver.LOGIN_OTHER");
localBroadcastManager.registerReceiver(localReceiver, intentFilter);

Button btn_send = (Button) findViewById(R.id.btn_send);
btn_s end.setOnClickListener(new View.OnClickListener() {
@ Override
public void onClick(View v) {
Intent intent = new Intent("com.jay.mybcreceiver.LOGIN_OTHER");
localBroadcastManager.sendBroadcast(intent);
}
});
}

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

わかりました、それは簡単です、アクティビティを登録することを忘れないでください~


2. Android 4.3 以降のバージョンでのブート ブロードキャストの監視の問題の解決策:

Android 4.3 以降のバージョンでは、次のことが許可されています。アプリケーションをSDにインストールすると、システムが起動することは誰もが知っています SD カードは短い間隔でしかロードされないため、アプリケーションはこのブロードキャストを監視できない可能性があります。 したがって、ブート ブロードキャストと SD カード マウント ブロードキャストの両方を監視する必要があります。

さらに、一部の携帯電話には SD カードがない場合があるため、これら 2 つのブロードキャスト モニターを同じインターネット フィルターに書き込むことはできません。 代わりに、2 つで記述する必要があり、構成コードは次のとおりです:

<receiver android:name=".MyBroadcastReceiver">
<intent-filter>
"/>
</intent -filter&gt;

3. よく使用されるシステム ブロードキャストの概要:

最後に、通常使用される可能性のあるシステム ブロードキャストをいくつか紹介します:

Intent.ACTION_AIRPLANE_MODE_CHANGED;
//機内モードでブロードキャストをオフまたはオンにします

<strong>Intent.ACTION_BATTERY_CHANGED;
//充電ステータス、またはバッテリーの電力が変化します
//バッテリーの充電ステータスと充電レベルChange の場合、このブロードキャストは確立ステートメントでは受信できず、Context.registerReceiver() を通じてのみ登録できます

<strong>Intent.ACTION_BATTERY_LOW;
//バッテリー残量が低いことを示します

<strong>Intent.ACTION_BATTERY_OKAY;
//バッテリー残量が十分であることを示します。つまり、バッテリー残量が低い状態からフル状態に変化したときにブロードキャストが発行されます

Intent.ACTION_BOOT_COMPLETED;
//システムの起動が完了した後、このアクションは 1 回だけブロードキャストされます。 。

Intent.ACTION_CAMERA_BUTTON;
//写真撮影時にカメラボタン(ハードウェアボタン)が押されたときにブロードキャスト

Intent.ACTION_CLOSE_SYSTEM_DIALOGS;
//画面がタイムアウトして画面がロックされたとき、ユーザーが電源ボタンを押したとき、長押しまたは短押し (ダイアログ ボックスが表示されるかどうかに関係なく) 画面をロックすると、Android システムはこのアクション メッセージをブロードキャストします

Intent.ACTION_CONFIGURATION_CHANGED;
//デバイスの現在の設定が変更されたときに送信されるブロードキャスト(変更を含む: インターフェース言語、デバイスの方向など、Configuration.java を参照してください)

Intent.ACTION_DATE_CHANGED;
//このブロードキャストは、デバイスの日付が変更されると送信されます

Intent.ACTION_DEVICE_STORAGE_LOW;
//ブロードキャストが送信されますデバイスのメモリが不足している場合、このブロードキャストはシステムによってのみ使用され、他のアプリでは利用できませんか?

Intent.ACTION_DEVICE_STORAGE_OK;
//デバイスのメモリが不足から十分になったときに送信されるブロードキャストは、システムでのみ使用でき、他のアプリでは使用できません。

Intent.ACTION_DOCK_EVENT;
//
//このブロードキャストが送信される場所 FrameworksbaseservicesjavacomandroidserverDockObserver.java

Intent.ACTION_EXTERNAL_APPLICATIONS_AVAILABLE;
////モバイル APP が完了した後、ブロードキャストが送信されます (モバイルは APP2SD を参照) )

Intent.ACTION_EXTERNAL_APPLICATIONS_UNAVAILABLE;
//APP の移動時に送信されるブロードキャスト (モバイルは APP2SD を参照)

Intent.ACTION_GTALK_SERVICE_CONNECTED;
//Gtalk が接続を確立したときに送信されるブロードキャスト

Intent.ACTION_GTALK_SERVICE _切断されました; talk
//G Disconnected 接続時にブロードキャスト

Intent.ACTION_HEADSET_PLUG;
//ヘッドフォンジャックにヘッドフォンを挿入したときにブロードキャスト

Intent.ACTION_INPUT_METHOD_CHANGED;
//入力方法を変更したときにブロードキャスト

Intent.ACTION_LOCALE_CHANGED;
//デバイスは現在、ロケールが変更されたときにブロードキャストされています

Intent.ACTION_MANAGE_PACKAGE_STORAGE;
//

Intent.ACTION_MEDIA_BAD_REMOVAL;
//SD カードが正しく取り外されませんでした (SD カードを取り外す正しい方法: 設定 - SD カード) and Device Memory- -SD カードをアンインストールします) ですが、SD カードが抜かれたときに送信されるブロードキャスト
//ブロードキャスト: 拡張メディア (拡張カード) が SD カード スロットから抜かれましたが、マウント ポイント (マウントポイント) が解放されていません (アンマウント)

Intent.ACTION_MEDIA_BUTTON;
//「メディアボタン」ボタン(ハードウェアボタン)がある場合、「メディアボタン」ボタンが押されたときにブロードキャスト

Intent.ACTION_MEDIA_CHECKING;
//SDカードなどの外部ストレージデバイスが挿入されている場合、システムは SD カードをチェックします。この時点で送信されたブロードキャストは?
Intent.ACTION_MEDIA_EJECT;
//外部大容量記憶装置 (SD カード、モバイル ハードディスクなど) によって送信されたブロードキャストは接続されていません。正しくアンインストールされたかどうかに関係なく送信されますか?
//ブロードキャスト : ユーザーは拡張メディアを取り外したい (拡張カードを抜く)。
Intent.ACTION_MEDIA_MOUNTED;
//SD カードが挿入され、正しくインストール (認識) されたときにブロードキャストします。
//ブロードキャスト: 拡張メディアが挿入され、マウントされています。
Intent.ACTION_MEDIA_NOFS;
//
Intent.ACTION_MEDIA_REMOVED;
//外部ストレージデバイスが正しくアンインストールされたかどうかに関係なく、このブロードキャストは発行されますか?
// ブロードキャスト: 拡張メディアが削除されました。
Intent.ACTION_MEDIA_SCANNER_FINISHED;
//ブロードキャスト: メディアのディレクトリがスキャンされました
Intent.ACTION_MEDIA_SCANNER_SCAN_FILE;
//
Intent.ACTION_MEDIA_SCANNER_STARTED;
//ブロードキャスト: メディアのディレクトリがスキャンされました

Intent.ACTION_MEDIA_共有;
// ブロードキャスト: 拡張メディアは USB 大容量ストレージとして共有されているため、アンマウントされます。
Intent.ACTION_MEDIA_UNMOUNTABLE;
//
Intent.ACTION_MEDIA_UNMOUNTED
//ブロードキャスト: 拡張メディアは存在しますが、マウントされていません (マウント)。
Intent.ACTION_NEW_OUTGOING_CALL;

Intent.ACTION_PACKAGE_ADDED;
//APK のインストールが成功した後
//ブロードキャスト: 新しいアプリケーション パッケージがデバイスにインストールされます。
//新しいアプリケーション パッケージがデバイスにインストールされており、データにはパッケージ名が含まれています (最後にインストールされたパッケージ プログラムはこのブロードキャストを受信できません)
Intent.ACTION_PACKAGE_CHANGED;
//パッケージを含む既存のアプリケーション パッケージが変更されましたname
Intent.ACTION_PACKAGE_DATA_CLEARED;
//アプリケーションのデータをクリアするときに発行されるブロードキャスト ([設定] -- [アプリケーション管理] -- アプリケーションを選択し、[データのクリア] をクリックします)
// ユーザーがパッケージのデータをクリアしました。パッケージ名を含めます (パッケージ消去プログラムはこのブロードキャストを受信できません)

Intent.ACTION_PACKAGE_INSTALL;
//電子マーケットでアプリケーションをダウンロードするなど、ダウンロードをトリガーしてブロードキャストのインストールを完了しますか?
//
Intent.ACTION_PACKAGE_REMOVED;
//APK の削除に成功した後に送信されたブロードキャスト
//パッケージ名を含む既存のアプリケーション パッケージがデバイスから削除されました (インストールされているパッケージ プログラムは、このブロードキャストでそれを受信できません)

Intent.ACTION_PACKAGE_REPLACED;
//既存のインストール パッケージを置き換えるときに発行されるブロードキャスト (このブロードキャストは、現在インストールされている APP が以前のものよりも新しいか古いかに関係なく発行されます)
Intent.ACTION_PACKAGE_RESSTARTED;
/ / ユーザーがパッケージを再起動すると、パッケージのすべてのプロセスが強制終了され、パッケージ名を含むそれに関連付けられたすべてのランタイム状態が削除されます (パッケージ プログラムを再起動すると、このブロードキャストを受信できません)
Intent.ACTION_POWER_CONNECTED;//外部電源が接続されているときにブロードキャストします
Intent.ACTION_POWER_DISCONNECTED;
//外部電源が切断されているときにブロードキャストします
Intent.ACTION_PROVIDER_CHANGED;
//

Intent.ACTION_REBOOT;
//デバイスが再起動されたときにブロードキャストします

Intent.ACTION_SCREEN_OFF;
//画面がオフになった後にブロードキャストします

Intent.ACTION_SCREEN_ON;
//画面がオンになった後にブロードキャストします

Intent.ACTION_SHUTDOWN;
//システムがオフになったときにブロードキャストします

Intent.ACTION_TIMEZONE_CHANGED ;
//タイムゾーンが変更されたときにブロードキャストします

Intent.ACTION_TIME_CHANGED;
//時間が設定されたときにブロードキャストします

Intent.ACTION_TIME_TICK;
//ブロードキャスト: 現在の時間が変更されました(通常のタイムラプス)。
//現在時刻は毎分送信されます。コンポーネント宣言では受信できません。

Intent.ACTION_UID_REMOVED; メソッドによってのみ登録できます。 ID がシステムから削除されました
//

Intent.ACTION_UMS_CONNECTED;
//デバイスが USB 大容量ストレージ状態になったときにブロードキャストしますか?

Intent.ACTION_UMS_DISCONNECTED;
//デバイスが USB 大容量ストレージ状態から通常状態に変化したときにブロードキャストしますか?

Intent.ACTION_USER_PRESENT;
//

Intent.ACTION_WALLPAPER_CHANGED;
//デバイスの壁紙が変更されたときにブロードキャストします

4. このセクションの概要:

これで、BroadcastReceiver について学習できます。追加や提案がありましたら、大歓迎です~ とても感謝しています〜