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



我有两个活动,一个是发送brodcust,另一个是接收。但接收器永远不会被呼叫-

主要活动

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>

您也可以通过这种方式在您的中放置广播接收器。

     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);
    }
}

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

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

如果广播将在应用程序中进行,那么最好使用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));    }
}

您不能将硼砂从一个活动发送到另一个活动。所以你必须像下面这样做。

首先将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>

最新更新