【问题标题】:How to send broadcast message on onCreate method in Android如何在 Android 中的 onCreate 方法上发送广播消息
【发布时间】:2023-08-24 04:56:01
【问题描述】:

我想向应用程序发送广播消息,然后从当前活动中接收它。我可以发送广播消息,但无法从广播接收器接收。这是我的代码;

public class LogIn extends Activity {

    private BroadcastReceiver receiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                //toast message received !
            }
        };

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

        ActionBar actionBar = getActionBar();
        //send broadcast message
        Intent i = new Intent(LogIn.class.getName());
        getContext().sendBroadcast(i);
    }

    @Override
    protected void onResume() {
        super.onResume();
        registerReceiver(receiver, new IntentFilter(LogIn.class.getName()));
    }

    @Override
    protected void onPause() {
        super.onPause();
        try {
            unregisterReceiver(receiver);
        } catch (Exception e) {}
    }
}

我错过了什么问题?谢谢你的帮助。。

【问题讨论】:

    标签: android broadcastreceiver send broadcast


    【解决方案1】:

    查看Activity's lifecycle 的图表。 onCreate() 方法在onResume() 之前运行,因此您在注册接收器之前发送广播。

    我不知道你为什么要广播到同一个班级,但你也可以通过在 onCreate() 中调用 registerReceiver() 方法来解决你的问题,在 sendBroadcast() 调用之前。

    【讨论】:

    • 嗨,迈克,谢谢你的明确回答,你的意思是我应该在 oncreate 中创建 registerreceiver() 方法
    • 我的意思是将onResume() 中的registerReceiver() 行复制到onCreate() 中的sendBroadcast() 行之前。摆脱粘性广播。
    • 耶!我只需要在发送消息之前调用 registerReceiver() 。这表明我不擅长 Activity 的生命周期,谢谢 Mike!
    【解决方案2】:

    您正在以不同的意图注册接收器并以不同的意图发送广播。这就是您收不到广播的原因。

    public class LogIn extends Activity{
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ActionBar actionBar = getActionBar();
        //send broadcast message
        Intent i = new Intent("com.abc");
        getContext().sendStickyBroadcast(i);
    }
    private BroadcastReceiver receiver=new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
            //toast message received !
            }
        };
    @Override
    protected void onResume() {
        super.onResume();
        registerReceiver(receiver, new IntentFilter("com.abc"));
    }
    @Override
    protected void onPause() {
        super.onPause();
        try {
            unregisterReceiver(receiver);
        } catch (Exception e) {
        }
    }
    

    添加权限

    <uses-permission android:name="android.permission.BROADCAST_STICKY"/>
    

    【讨论】:

    • 你也可以试试stickyBroadcastReceiver