Penerima SiaranPao Ding Jie Niu


Pengenalan kepada bahagian ini:

Dalam bahagian sebelumnya, kami sudah mempunyai pemahaman awal tentang Penerima Siaran dan mengetahui dua jenis siaran: standard dan tersusun. Daftar penerima siaran secara dinamik atau statik, dengar siaran sistem dan hantar sendiri siaran! Keperluan asas kami telah dipenuhi~ Tetapi siaran yang ditulis di atas semuanya adalah siaran global! Ini juga bermakna siaran yang dihantar oleh APP kami akan diterima oleh APP lain. Atau siaran yang dihantar oleh APP lain juga akan diterima oleh APP kami, yang boleh menyebabkan beberapa isu keselamatan dengan mudah! dan Android memberikan kami mekanisme siaran tempatan Siaran yang dikeluarkan menggunakan mekanisme ini hanya akan disebarkan dalam APP, dan Penerima siaran hanya boleh menerima siaran yang dihantar oleh aplikasi ini!


1 Siaran tempatan

1) Penggunaan teras:

1.png

PS: Siaran tempatan tidak boleh Diterima melalui pendaftaran statik, ia lebih cekap daripada penyiaran global sistem

2) Nota:

2.png

3) Contoh kod (di tempat lain Log masuk untuk menendang pengguna di luar talian):

Seperti WeChat, jika WeChat sedang berjalan, jika kita log masuk semula ke akaun kita dengan telefon bimbit lain, yang sebelumnya akan mengingatkan akaun Log masuk ke terminal lain seperti ini, kemudian tutup semua aktiviti yang kami buka, dan kemudian kembali ke halaman log masuk seperti ini~
Mari tulis contoh mudah di bawah:

Operasi rendering :

3.gif

Pelaksanaan kod:

Langkah 1: Sediakan ActivityCollector yang menutup semua aktiviti yang disediakan oleh Activity sebelumnya telah digunakan di sini

ActivityCollector.java

ActivityCollector kelas awam {
    senarai statik pribadi<Aktiviti> aktiviti = baharu ArrayList<Activity>();
    public static void addActivity(Aktiviti aktiviti) {
         activities.add(activity);
    }
    }<🎜       statik 🎜 >         activities.remove(activity);
    }
    public statik void finishAll() {
         untuk (Aktiviti aktiviti : aktiviti) {
                                    semat >                aktiviti .finish (); }
}
}
}


Langkah 2
: 先 写 要 给 简单 的 的 的 的 的 的 的 的 的 的 的 用来 用来 用来 用来 用来,接着写下登陆界面!

kelas awam BaseActivity melanjutkan AppCompatActivity {

    @Override
     dilindungi tidak sah (B pada tidak dilindungi          ActivityCollector.addActivity(this);
    }

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

LoginActivity.java:


kelas awam LoginActivity melanjutkan BaseActivity melaksanakan View.OnClickListener{


    pribadi SharedPreferences pref;
    peribadi atau Edit Persendirian ><🎜 atau SharedPreferences sendiri. ><🎜 . vate EditText edit_user;
    peribadi EditText edit_pawd;
    pribadi Butang btn_login;


    @Override
    dilindungi tidak sah onCreate (Bundle sa ) {(Bundle sa ) {(Bundle sa ) reate(savedInstanceState);
        setContentView(R .layout.activity_login);
        pref = PreferenceManager.getDefaultSharedPreferences(this);

        bindViews();
    

    vo (prima >
                                                                                                                                                             view   pengguna_edit = ( EditText) findViewById(R.id.edit_user);
        edit_pawd = (EditText) findViewById(R.id.edit_pawd);
        btn_login = (Daftar masuk. 🎜>        btn_login. setOnClickListener(this);
    }

    @Override
    protected void onStart() {
        super.onStart();,"
        (pengguna) ").equals("")){
            edit_user.setText(pref.getString("user",""));
            edit_pawd.setText(pref.getString("pawd",""));
        }
    }

    @Override
    public void onClick(View v) {
       (String user = edit_user = String user = edit_user       public void onClick(Lihat v) {
       (String user = edit_<. wd = edit_pawd .getText().toString();
        if(user.equals("123")&&pawd.equals("123")){
            editor = pref.edit();
                 editor "pengguna", pengguna);
editor.putString("pawd", pawd);
     editor.commit();
      Intent intent = Niat baharu(LoginActivity.this, MainActivity.class); (mulaiActivity.class); (mulakanAktiviti.class); .makeText(LoginActivity.this, "Oh, saya betul~",Toast.LENGTH_SHORT).show();
finish();
} else{
Toast.makeText(LoginActivity.this, " Ia sangat mudah untuk dikeluarkan, di manakah otak anda?",Toast.LENGTH_SHORT).show();
                                                                                                                                                                          Lengkapkan operasi kotak dialog pop timbul dalam onReceive dan mulakan halaman log masuk: my.B<🎜 MyBcReceiver kelas awam memanjangkan BroadcastReceiver {
@Override
public void onReceive(konteks Konteks akhir, Niat niat) {
AlertDialog.Builder dialogBuilder = AlertDialog.Builder(context);
dialogBuilder.setTitle(" Amaran:");
dialogBuilder.setMessage("Akaun anda dilog masuk di tempat lain, sila log masuk semula~");
dialogBuilder.setCancelable(false);
dialogBuilder.setPositiveButton("OK",
DialogInterface.OnClickListener() baharu {
@Override
public void onClick(DialogInterface dialog, int which) {
                  ActivityCollector.finishAll                                                                     intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                        context.startActivity(niat);
                                                                                                                                                                >        AlertDialog alertDialog = dialogBuilder.create();
        alertDialog.getWindow(). setType(
                WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
        alertDialog.show();
    }
}
<🎜


Jangan lupa untuk menambah kebenaran dialog sistem dalam AndroidManifest.xml: < uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />

Langkah 4: Dalam MainActivity, nyatakan localBroadcastManager, gunakannya untuk menyelesaikan operasi yang berkaitan dan musnahkannya sebagai tambahan Beri perhatian kepada unregisterReceiver!

MainActivity.java

kelas awam MainActivity melanjutkan BaseActivity {

    pribadi MyBcReceiver localReceiver;
    pribadi LocalBroadcasttentManager Local In FilterManager local 🎜 va>; 🎜>
    @Override
    dilindungi void onCreate (Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        localManagerBroadcastInstance = LocalBroadcastManager = LocalBroadcastManager = thiger get       //初始化广播接收者,设置过滤器
        localReceiver = baharu MyBcReceiver();
        intentFilter = new IntentFilter();
               LOG intent IN_OTHER");
        localBroadcastManager.registerReceiver( localReceiver, intentFilter);

        Butang btn_send = (Button) findViewById(R.id.btn_send);
        btn_send.set(OnClick Listener.            kosong awam onClick(Lihat v) {
                Niat niat = niat baharu("com.jay.mybcreceiver.LOGIN_OTHER");
                                                                                       . 🎜>        });
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        localBroadcastManager.unregister Receiver>}<🎜 Receiver>}<🎜 🎜>

Baiklah, semudah itu, jangan lupa daftarkan Aktiviti~


2 Menyelesaikan masalah memantau siaran permulaan pada Android 4.3 dan ke atas:

Hidup. Versi Android 4.3 dan ke atas, membolehkan kami memasang aplikasi pada SD, kita semua tahu bahawa sistem but Kad SD dimuatkan hanya selepas selang masa yang singkat, jadi aplikasi kami mungkin tidak dapat memantau siaran ini! Jadi kita perlu memantau kedua-dua siaran but dan siaran pelekap kad SD!

Selain itu, sesetengah telefon mudah alih mungkin tidak mempunyai kad SD, jadi kami tidak boleh menulis kedua-dua monitor siaran ini ke dalam penapis Intetn yang sama. Sebaliknya, ia hendaklah ditulis dalam dua. Kod konfigurasi adalah seperti berikut: name="android.intent.action.BOOT_COMPLETED"/>

  </intent-filter>
  <intent-filter>
  <action android:name="ANDROID.INTENT.ACTION. MEDIA_MOUNTED"/>
  <action android:name="ANDROID.INTENT.ACTION.MEDIA_UNMOUNTED"/>
  <data android :scheme="file"/>
</intent -filter>
</receiver>


3. Ringkasan siaran sistem yang biasa digunakan:

Akhir sekali, izinkan saya memberikan anda beberapa siaran sistem yang biasanya kami gunakan:

Niat.MOD_PETERBANG_ACTION_CHANGED;
//Siarkan apabila mematikan atau menghidupkan mod kapal terbang

<strong>Niat.ACTION_BATTERY_CHANGED;
//status acara pengecasan kuasa bateri Tukar
//Status pengecasan dan tahap pengecasan perubahan bateri Siaran ini tidak boleh diterima melalui penyata penubuhan Ia hanya boleh didaftarkan melalui Context.registerReceiver()

<strong>Intent. ACTION_BATTERY_LOW;
// Menunjukkan kuasa bateri rendah

<strong>Niat.ACTION_BATTERY_OKAY;
//Menunjukkan kuasa bateri mencukupi, iaitu siaran akan dikeluarkan apabila kuasa bateri bertukar daripada rendah kepada penuh.

Niat.ACTION_BOOT_COMPLETED;
//Selepas permulaan sistem selesai, tindakan ini disiarkan sekali (sekali sahaja).

Niat.ACTION_CAMERA_BUTTON;
//Siarkan apabila butang kamera (butang perkakasan) ditekan semasa mengambil gambar

Niat.ACTION_CLOSE_SYSTEM_DIALOGS;
//Kunci apabila skrin tamat masa Apabila pengguna menekan butang kuasa, menekan lama atau menekan pendek (tidak kira sama ada kotak dialog muncul) dan mengunci skrin, sistem android akan menyiarkan mesej Tindakan ini

Intent.ACTION_CONFIGURATION_CHANGED;
//Siaran dipancarkan apabila tetapan semasa peranti ditukar (termasuk perubahan: bahasa antara muka, orientasi peranti, dsb., sila rujuk Configuration.java)

Intent.ACTION_DATE_CHANGED;
//Apabila tarikh peranti berubah Hantar siaran ini

Niat.ACTION_DEVICE_STORAGE_LOW;
//Siaran dihantar apabila peranti tidak mempunyai memori yang mencukupi Siaran ini hanya boleh digunakan oleh sistem dan tidak tersedia untuk APP lain?

Niat.ACTION_DEVICE_STORAGE_OK;
//Siaran dihantar apabila memori peranti berubah daripada tidak mencukupi kepada mencukupi Siaran ini hanya boleh digunakan oleh sistem dan tidak boleh digunakan oleh APP lain?

Intent.ACTION_DOCK_EVENT;
//
//Tempat penyiaran ini dikeluarkan frameworksbaseservicesjavacomandroidserverDockObserver.java

Intent.ACTION_EXTERNAL_APPLICATION>/the/APLICATIONS_AVAILABLE> APP selesai, Siaran dikeluarkan (mudah alih merujuk kepada: APP2SD)

Niat.ACTION_EXTERNAL_APPLICATIONS_UNAVAILABLE;
//Apabila APP sedang dialihkan, siaran dikeluarkan (mudah alih merujuk kepada: APP2SD)

Intent.ACTION_GTALK_SERVICE_CONNECTED;
//Broadcast apabila Gtalk telah mewujudkan sambungan

Intent.ACTION_GTALK_SERVICE_DISCONNECTED;
//Broadcast apabila Gtalk telah diputuskan sambungan<🎜_🎜>ADSET. /Siaran dipancarkan apabila memasukkan fon kepala ke dalam bicu fon kepala

Niat.ACTION_INPUT_METHOD_CHANGED;
//Siaran dipancarkan apabila menukar kaedah input

Niat.ACTION_LOCALE_CHANGED;
//Peranti sedang Pada masa ini Siarkan apabila setempat telah berubah

Niat.ACTION_MANAGE_PACKAGE_STORAGE;
//

Niat.ACTION_MEDIA_BAD_REMOVAL;
//Kad SD tidak dialih keluar dengan betul (kad SD dialih keluar dengan betul Kaedah: Tetapan- -Kad SD dan memori peranti--Nyahlekapkan kad SD), tetapi siaran dihantar apabila kad SD telah dikeluarkan
//Siaran: Medium pengembangan (kad pengembangan) telah ditarik keluar daripada slot kad SD , ​​tetapi titik lekap (titik lekap) belum dilepaskan (nyahlekap)

Niat. ACTION_MEDIA_BUTTON;
//Siarkan apabila butang "Media Button" ditekan, jika terdapat butang "Media Button" (butang perkakasan)

Intent.ACTION_MEDIA_CHECKING;
//Apabila memasukkan peranti storan luaran, seperti kad SD , ​​sistem akan menyemak kad SD, siaran yang dihantar pada masa ini?
Niat.ACTION_MEDIA_EJECT;
//Siaran yang dihantar oleh peranti storan jisim luaran (seperti kad SD atau cakera keras mudah alih ) telah dicabut, sama ada ia betul atau tidak Siaran ini akan dikeluarkan walaupun semasa menyahpasang?
//Siaran: Pengguna ingin mengalih keluar media pengembangan (cabut palam kad pengembangan).
Niat.ACTION_MEDIA_MOUNTED;
//Siarkan apabila kad SD dimasukkan dan dipasang dengan betul (dikenali)
//Siaran: Media lanjutan dimasukkan dan telah dipasang.
Niat.ACTION_MEDIA_NOFS;
//
Niat.ACTION_MEDIA_REMOVED;
//Peranti storan luaran telah dialih keluar Adakah siaran ini dikeluarkan tanpa mengira sama ada ia dinyahpasang dengan betul?
// Siaran: Media lanjutan dialih keluar.
Niat.ACTION_MEDIA_SCANNER_FINISHED;
//Siaran: Direktori media telah diimbas
Niat.ACTION_MEDIA_SCANNER_SCAN_FILE;
//
Niat.ACTION_MEDIA_SCAN_ED:/Memulakan_MEDIA_SCAN://
Niat. Direktori

Intent.ACTION_MEDIA_SHARED;
// Siaran: Media lanjutan dinyahlekap kerana ia telah dikongsi sebagai storan besar-besaran USB.
Niat.ACTION_MEDIA_UNMOUNTABLE;
//
Intent.ACTION_MEDIA_UNMOUNTED
// Siaran: Medium lanjutan wujud, tetapi belum dipasang (melekap).
Niat.ACTION_NEW_OUTGOING_CALL;

Intent.ACTION_PACKAGE_ADDED;
//Selepas berjaya memasang APK
//Broadcast: Pakej aplikasi baharu dipasang pada peranti.
//Pakej aplikasi baharu telah dipasang pada peranti, data termasuk nama pakej (program pakej terkini yang dipasang tidak boleh menerima siaran ini)
Niat.ACTION_PACKAGE_CHANGED;
//Pakej aplikasi sedia ada Mempunyai telah ditukar, termasuk nama pakej
Intent.ACTION_PACKAGE_DATA_CLEARED
//Siaran yang dikeluarkan semasa mengosongkan data aplikasi (apabila memilih aplikasi dalam Tetapan - Pengurusan Aplikasi - dan kemudian mengklik Kosongkan Data?)
/ /Pengguna telah mengosongkan data pakej, termasuk nama pakej (program pakej pembersihan tidak boleh menerima siaran ini)

Niat.ACTION_PACKAGE_INSTALL;
//Siaran dihantar apabila muat turun dicetuskan dan pemasangan selesai , seperti memuat turun aplikasi dalam pasaran elektronik?
//
Niat.ACTION_PACKAGE_REMOVED;
//Siaran dikeluarkan selepas berjaya memadamkan APK
//Pakej aplikasi sedia ada telah dialih keluar daripada peranti, termasuk nama pakej ( Program pakej sedang dipasang tidak boleh menerima siaran ini)

Niat.ACTION_PACKAGE_REPLACED;
//Siaran dikeluarkan apabila menggantikan pakej pemasangan sedia ada (tidak kira sama ada APP yang dipasang pada masa ini lebih baharu atau lebih lama daripada yang sebelumnya), adakah siaran ini akan dikeluarkan? )
Intent.ACTION_PACKAGE_RESSTARTED;
//Pengguna memulakan semula pakej, semua proses pakej akan dimatikan dan semua keadaan runtime yang dikaitkan dengannya harus dialih keluar, termasuk nama pakej ( Program pakej restart tidak boleh menerima siaran ini)
Niat.ACTION_POWER_CONNECTED;
//Siaran dipancarkan apabila bekalan kuasa luaran dipalamkan
Niat.ACTION_POWER_DISCONNECTED;
//Siaran dipancarkan apabila bekalan kuasa luaran diputuskan
Niat.ACTION_PROVIDER_CHANGED;
//

Niat.ACTION_REBOOT;
//Siarkan apabila memulakan semula peranti

Niat.ACTION_SCREEN_OFF;
//Siarkan selepas skrin dimatikan

Niat.ACTION_SCREEN_ON>;<🎜 // Siarkan selepas skrin dibuka

Intent.ACTION_SHUTDOWN;
//Broadcast apabila sistem dimatikan

Intent.ACTION_TIMEZONE_CHANGED;
//Broadcast apabila zon waktu perubahan

Niat.ACTION_TIME_CHANGED;
//Siaran dipancarkan apabila masa ditetapkan

Niat.ACTION_TIME_TICK;
//Siaran: Masa semasa telah berubah (selang masa biasa) .
//Masa semasa berubah dan dihantar setiap minit Ia tidak boleh diterima melalui pengisytiharan komponen Ia hanya boleh didaftarkan melalui kaedah Context.registerReceiver()

Intent.ACTION_UID_REMOVED;
. //ID pengguna telah Alih keluar siaran daripada sistem
//

Niat.ACTION_UMS_CONNECTED;
//Siaran dihantar apabila peranti telah memasuki keadaan storan jisim USB?

Niat.ACTION_UMS_DISCONNECTED;
//Siarkan apabila peranti telah bertukar daripada keadaan storan massa USB kepada keadaan biasa?

Niat.ACTION_USER_PRESENT;
//

Niat.ACTION_WALLPAPER_CHANGED;
//Siarkan apabila kertas dinding peranti telah ditukar

4. Ringkasan bahagian ini:

Baiklah, itu sahaja untuk mempelajari tentang BroadcastReceiver Jika anda mempunyai sebarang tambahan atau cadangan, sila berikan mereka~ Bersyukur sangat~