Lập trình đăng ký một máy thu phát sóng


149

Tôi muốn biết cách thực hành / cách tốt nhất để đăng ký một máy thu phát sóng là gì. Tôi muốn đăng ký người nhận cụ thể theo sự lựa chọn của người dùng.

Vì việc đăng ký được thực hiện thông qua tệp kê khai, tôi tự hỏi liệu có cách nào phù hợp để đạt được điều này trong mã không.


2
CoderzPassion Broadcast Reciever hướng dẫn chi tiết nhất từ ​​trước đến nay
karanatwal.github.io

Vui lòng tham khảo Liên kết stackoverflow.com/questions/15698790/

Câu trả lời:


64

Có vẻ như bạn muốn kiểm soát xem các thành phần được xuất bản trong tệp kê khai của bạn có hoạt động hay không, không đăng ký động một người nhận (thông qua Context.registerReceiver ()) trong khi chạy.

Nếu vậy, bạn có thể sử dụng PackageManager.setComponentEnablesSetting () để kiểm soát xem các thành phần này có hoạt động hay không:

http://developer.android.com/reference/android/content/pm/PackageManager.html#setComponentEnablesSetting(android.content.ComponentName, int, int)

Lưu ý nếu bạn chỉ quan tâm đến việc nhận phát sóng trong khi bạn đang chạy, tốt hơn là sử dụng registerReceiver (). Thành phần máy thu chủ yếu hữu ích khi bạn cần đảm bảo ứng dụng của mình được khởi chạy mỗi khi chương trình phát được gửi.


1
Tài giỏi ! Bạn đã cho tôi thẳng. Cảm ơn bạn rất nhiều
CoolStraw

Một điều tuyệt vời - không có ý tưởng nào bạn có thể làm điều này :)
Chris Noldus


1
@hackbod Làm cách nào để thêm thẻ siêu dữ liệu trong trình nhận tùy chỉnh? Bạn có ý kiến ​​gì không !! Tôi cần thêm thẻ siêu dữ liệu mà chúng tôi sử dụng trong androidmanifest.xml.
Zala Janaksinh

1
Hướng dẫn tốt nhất cho đến ngày coderzpassion.com/implement-broadcastreceiver-android và bằng ngôn ngữ đơn giản
Jagjit Singh

269

Trong onCreatephương pháp của bạn, bạn có thể đăng ký một người nhận như thế này:

private BroadcastReceiver receiver;

@Override
public void onCreate(Bundle savedInstanceState){

  // your oncreate code should be

  IntentFilter filter = new IntentFilter();
  filter.addAction("SOME_ACTION");
  filter.addAction("SOME_OTHER_ACTION");

  receiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
      //do something based on the intent's action
    }
  };
     registerReceiver(receiver, filter);
}

Hãy nhớ chạy cái này trong onDestroyphương thức:

 @Override
 protected void onDestroy() {
  if (receiver != null) {
   unregisterReceiver(receiver);
   receiver = null;
  }
  super.onDestroy();
 }

19
Cảm ơn, điều này đã làm việc tuyệt vời. Để gửi truyền phát, tôi đã sử dụng mã Intent i = new Intent ("SOME_ACTION"); sendBroadcast (i);
Ben Clayton

7
Tại sao không vào sơ yếu lý lịch và bắt đầu?
Syed Raza Mehdi

Điều gì sẽ xảy ra nếu tôi không hủy đăng ký máy thu phát sóng? Nó sẽ rời khỏi máy thu phát sóng đã đăng ký, ngay cả sau khi khởi động lại?
Jaydev

5
Nó không được đảm bảo onDestroy()sẽ được gọi, do đó tạo ra rò rỉ bộ nhớ tiềm năng. Tốt hơn là đăng ký / hủy đăng ký trong onStart()/ onStop().
Neria Nachum

Điều này có nghĩa là tôi không phải tạo một lớp thu phát? Tôi chỉ có thể đặt tất cả mã onReceive () của mình vào đây và nó có hoạt động không?
Taslim Oseni

70

Một điểm quan trọng mà mọi người quên đề cập đến là thời gian sống của Broadcast Receiver. Sự khác biệt của việc đăng ký theo chương trình từ việc đăng ký trong AndroidManifest.xml là ở chỗ. Trong tệp kê khai, nó không phụ thuộc vào thời gian sử dụng của ứng dụng. Trong khi khi đăng ký theo chương trình, nó phụ thuộc vào thời gian sử dụng của ứng dụng. Điều này có nghĩa là nếu bạn đăng ký trong AndroidManifest.xml , bạn có thể bắt được các ý định được phát sóng ngay cả khi ứng dụng của bạn không chạy.

Chỉnh sửa: Ghi chú được đề cập không còn đúng kể từ Android 3.1, hệ thống Android loại trừ tất cả người nhận khỏi nhận ý định theo mặc định nếu người dùng chưa bao giờ khởi động ứng dụng hoặc nếu người dùng dừng ứng dụng rõ ràng qua menu Android (trong Quản lý → Ứng dụng). https://developer.android.com/about/versions/android-3.1.html

Đây là một tính năng bảo mật bổ sung vì người dùng có thể chắc chắn rằng chỉ những ứng dụng mà anh ta khởi động mới nhận được ý định phát sóng.

Vì vậy, nó có thể được hiểu là các máy thu được đăng ký theo chương trình trong Ứng dụng onCreate()sẽ có tác dụng tương tự với các máy thu được khai báo trong AndroidManifest.xml từ Android 3.1 ở trên.


1
Đây là một lưu ý tốt. Tôi thực sự đang xem một cuốn sách tôi đang đọc về Android và tự hỏi tại sao cả hai phương pháp thực hiện phát sóng đã được thực hiện. Dường như với tôi rằng nó là để tương thích ngược. Nhưng tôi không chắc chắn mặc dù.
Chiến tranh neon 17/2/2015

Vâng, bạn có thực sự điều rằng chỉnh sửa là đúng? Ý tôi là câu cuối cùng. Android có khả năng giết ứng dụng của bạn bất cứ lúc nào, điều này sẽ dẫn đến việc người nhận đã đăng ký theo chương trình của bạn không hoạt động nữa, nhưng bản kê khai đã đăng ký sẽ vẫn hoạt động.
JacksOnF1re

40

Xác định một máy thu quảng bá ở bất cứ đâu trong Activity / Fragment như thế này:

mReceiver = new BroadcastReceiver() {
 @Override
 public void onReceive(Context context, Intent intent) {
     Log.d(TAG," onRecieve"); //do something with intent
   }
 };

Xác định IntentFilter trong onCreate()

mIntentFilter=new IntentFilter("action_name");

Bây giờ hãy đăng ký BroadcastReciever onResume()và hủy đăng ký nó trong onPause()[vì không sử dụng phát sóng nếu hoạt động bị tạm dừng].

@Override
protected void onResume() {
     super.onResume();
     registerReceiver(mReceiver, mIntentFilter);
}

@Override
protected void onPause() {
    if(mReceiver != null) {
            unregisterReceiver(mReceiver);
            mReceiver = null;
    }
    super.onPause();
}

Để biết hướng dẫn chi tiết, hãy xem máy thu phát sóng - hai cách để thực hiện .


ví dụ tốt nhất cho đến nay tôi đã tìm thấy! Cảm ơn!
Ayush G lòng

1
@SohailAziz Liên kết cung cấp một câu trả lời tốt. Bạn có thể đặt bối cảnh của liên kết trong câu trả lời của bạn, để nếu liên kết không hoạt động, câu trả lời của bạn vẫn có liên quan?
iRuth

theo quan điểm cá nhân của tôi, phát sóng nên được đăng ký trong onResume và onPause như bạn đề xuất nhưng một số người nói rằng nó phải được bật trên OnCreate và onDestroy, bạn có thể giải thích ưu và nhược điểm cho cả hai không?
Syed Raza Mehdi

2
@SyedRazaMehdi nếu quảng bá được sử dụng để cập nhật UI [trong hầu hết các trường hợp], bạn nên đăng ký nó trong onResume và hủy đăng ký trong onPause vì phát sóng sẽ vô dụng.
SohailAziz

Cảm ơn. Đây là câu trả lời tốt nhất.
Saeid Z

4
package com.example.broadcastreceiver;


import android.app.Activity;
import android.content.IntentFilter;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.widget.Toast;

public class MainActivity extends Activity {

   UserDefinedBroadcastReceiver broadCastReceiver = new UserDefinedBroadcastReceiver();

   @Override
   public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
   }

   @Override
   public boolean onCreateOptionsMenu(Menu menu) {
      getMenuInflater().inflate(R.menu.main, menu);
      return true;
   }

   /**
    * This method enables the Broadcast receiver for
    * "android.intent.action.TIME_TICK" intent. This intent get
    * broadcasted every minute.
    *
    * @param view
    */
   public void registerBroadcastReceiver(View view) {

      this.registerReceiver(broadCastReceiver, new IntentFilter(
            "android.intent.action.TIME_TICK"));
      Toast.makeText(this, "Registered broadcast receiver", Toast.LENGTH_SHORT)
            .show();
   }

   /**
    * This method disables the Broadcast receiver
    *
    * @param view
    */
   public void unregisterBroadcastReceiver(View view) {

      this.unregisterReceiver(broadCastReceiver);

      Toast.makeText(this, "unregistered broadcst receiver", Toast.LENGTH_SHORT)
            .show();
   }
}

1
Bạn có thể vui lòng giải thích cho OP tại sao đây là cách thực hành tốt nhất?
Martin Prikryl

1
Họ không giải thích, "họ" luôn đăng mã, vì bạn biết nhiều hơn. -Sarcasm
neon

2

Theo Nghe và phát tin nhắn toàn cầu, và đặt báo thức trong các tác vụ thông thường và cách thực hiện chúng trong Android :

Nếu lớp nhận không được đăng ký bằng tệp kê khai của nó, bạn có thể tự động khởi tạo và đăng ký người nhận bằng cách gọi Context.registerReceiver () .

Hãy xem registerReceiver (bộ thu BroadcastReceiver, bộ lọc IntentFilter) để biết thêm thông tin.


1
Tôi đã thử gọi context.registerReceivernhưng không được gọi, bạn có thể xem câu hỏi này stackoverflow.com/questions/13238600/ không
Săn

2

Cách tốt nhất là luôn luôn cung cấp sự cho phép khi đăng ký người nhận, nếu không bạn sẽ nhận được cho bất kỳ ứng dụng nào gửi ý định phù hợp. Điều này có thể cho phép các ứng dụng độc hại phát đến người nhận của bạn.


1

cho LocalBroadcastManager

   Intent intent = new Intent("any.action.string");
   LocalBroadcastManager.getInstance(context).
                                sendBroadcast(intent);

và đăng ký onResume

LocalBroadcastManager.getInstance(
                    ActivityName.this).registerReceiver(chatCountBroadcastReceiver, filter);

và hủy đăng ký nó onStop

LocalBroadcastManager.getInstance(
                ActivityName.this).unregisterReceiver(chatCountBroadcastReceiver);

và nhận nó ..

mBroadcastReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            Log.e("mBroadcastReceiver", "onReceive");
        }
    };

IntentFilter ở đâu

 new IntentFilter("any.action.string")

1

Hai lựa chọn

1) Nếu bạn chỉ muốn đọc Phát sóng khi Hoạt động hiển thị thì

registerReceiver(...) trong onStart()unregisterReceiver(...)trongonStop()

2) Nếu bạn muốn đọc Phát ngay cả khi Hoạt động ở chế độ Nền thì

registerReceiver(...)trong onCreate(...)unregisterReceiver(...)trongonDestroy()

Tặng kem:

Nếu bạn lười biếng

Nếu bạn không muốn viết mã soạn sẵn để đăng ký và hủy đăng ký BroadcastReceiver nhiều lần trong mỗi Hoạt động thì,

  1. Tạo một hoạt động trừu tượng
  2. Viết mã soạn sẵn trong Hoạt động
  3. Để việc thực hiện như các phương thức trừu tượng

Đây là đoạn mã:

Hoạt động trừu tượng

public abstract class BasicActivity extends AppCompatActivity {

    private BroadcastReceiver broadcastReceiver;
    private IntentFilter filter;
    private static final String TAG = "BasicActivity";

    /**********************************************************************
    *                   Boilerplate code
    **********************************************************************/

    @Override
    public void onCreate(Bundle sis){
        super.onCreate(sis);
        broadcastReceiver = getBroadcastReceiver();
        filter = getFilter();
    }

    @Override
    public void onStart(){
        super.onStart();
        register();
    }

    @Override
    public void onStop(){
        super.onStop();
        unregister();
    }

    private void register(){
        registerReceiver(broadcastReceiver,filter);
    }

    private void unregister(){
        unregisterReceiver(broadcastReceiver);
    }

    /**********************************************************************
    *                   Abstract methods
    **********************************************************************/

    public abstract BroadcastReceiver getBroadcastReceiver();

    public abstract IntentFilter getFilter();

}

Sử dụng phương pháp này, bạn có thể viết thêm mã soạn sẵn như viết hình động phổ biến, ràng buộc với một dịch vụ, v.v.

Xem mã đầy đủ:

ĐÂY


0

Tạo một máy thu phát sóng

[BroadcastReceiver (Đã bật = true, Đã xuất = false)]

public class BCReceiver : BroadcastReceiver
{

    BCReceiver receiver;

    public override void OnReceive(Context context, Intent intent)
    {
        //Do something here
    }
}

Từ hoạt động của bạn thêm mã này:

LocalBroadcastManager.getInstance(ApplicationContext)
    .registerReceiver(receiver, filter);
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.