在活动中注册的BroadcastReceiver永远不会被调用

时间:2016-04-29 03:49:02

标签: android broadcastreceiver

我有2个活动,一个是发送广播,另一个是接收。但接收器永远不会被称为 -

MainActivity

public class MainActivity extends AppCompatActivity {

public static String BROADCAST_ACTION = "com.aj.SHOWTOAST";

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

public void sendBroadcast(View v) {
    Intent broadcast = new Intent();
    broadcast.setAction(BROADCAST_ACTION);
    this.sendBroadcast(broadcast);
}
}

ToastDisplay

public class ToastDisplay extends AppCompatActivity {
public static String BROADCAST_ACTION = "com.aj.SHOWTOAST";

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_toast_display);

    IntentFilter filter = new IntentFilter(BROADCAST_ACTION);
    this.registerReceiver(new Receiver(), filter);
}

private class Receiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context arg0, Intent arg1) {
        Log.d("TAG", "onReceive: SMS SENT!!");
        Toast.makeText(getApplicationContext(), "SMS SENT!!", Toast.LENGTH_SHORT).show();
    }
}
}

清单

<activity android:name=".MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity android:name=".ToastDisplay">
        <intent-filter>
            <action android:name="com.aj.SHOWTOAST" />
            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
    </activity>

3 个答案:

答案 0 :(得分:0)

您也可以通过这种方式将广播接收器放入您的手中。

     public class SampleActivity extends AppCompatActivity {

    public static final String DISPLAY_MESSAGE_ACTION = "com.google.android.gcm.demo.app.DISPLAY_MESSAGE";
    // Receive Message through Broadcast Receiver...
    private final BroadcastReceiver mHandleMessageReceiver = new BroadcastReceiver() {

        @Override
        public void onReceive(Context context, Intent intent) {
            String receiver = intent.getStringExtra("receiver");
            Toast.makeText(context, "" + receiver, Toast.LENGTH_SHORT).show();
        }
    };

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

    @Override
    protected void onResume() {
        super.onResume();
        //registering the receiver...
        registerReceiver(mHandleMessageReceiver, new IntentFilter(DISPLAY_MESSAGE_ACTION));
    }

    @Override
    protected void onPause() {
        super.onPause();
        //Unregistering the receiver...
        unregisterReceiver(mHandleMessageReceiver);
    }
}

可以通过以下意图调用广播接收器。你可以在任何调用此广播接收器的地方使用此意图。例如,有两个活动,在这两个活动中,您正在使用此接收器,并且您从处理服务器响应或数据库结果的其他类调用此意图。无论哪个活动在前面,活动接收器都将被调用。即,如果您正在调用此接收器意图,则活动1在前面,然后将触发活动接收器中的接收器。

 Intent intent = new Intent(SampleActivity.DISPLAY_MESSAGE_ACTION);
 intent.putExtra("receiver", "testMessage");
 sendBroadcast(intent);

答案 1 :(得分:0)

如果广播将在应用内发生,那么最好使用LocalBroadCastManager

public class MainActivity extends AppCompatActivity {

public static String BROADCAST_ACTION = "com.aj.SHOWTOAST";

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

public void sendBroadcast(View v) {
   Intent broadcast = new Intent();
   broadcast.setAction(BROADCAST_ACTION);
  LocalBroadcastManager.getInstance(getActivity()).sendBroadcast(broadcast);
} 
}

public class ToastDisplay extends AppCompatActivity {
public static String BROADCAST_ACTION = "com.aj.SHOWTOAST";

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_toast_display);

BroadcastReceiver receiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            //your code here
        }
    };
    LocalBroadcastManager.getInstance(getActivity()).registerReceiver(receiver, new IntentFilter(BROADCAST_ACTION));    }
}

答案 2 :(得分:-1)

您无法将boradcast一项活动发送到另一项活动。所以你必须这样做。

首先将Receiver实现为单独的类。

Receiver.java:

public class Receiver extends BroadcastReceiver {
    public Receiver() {
    }

    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context,"Hello", Toast.LENGTH_LONG).show();
    }
}

MainActivity.java:

public class MainActivity extends AppCompatActivity {

    private static final String BROADCAST_ACTION = "com.aj.SHOWTOAST";

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

    public void sendBroadcast(View v) {
        Intent broadcast = new Intent();
        broadcast.setAction(BROADCAST_ACTION);
        this.sendBroadcast(broadcast);
    }
}

清单应如下所示。

        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <receiver
            android:name=".Receiver"
            android:enabled="true"
            android:exported="true">
            <intent-filter>
                <action android:name="com.aj.SHOWTOAST"/>
            </intent-filter>
        </receiver>