繁体   English   中英

无法通过活动发送和接收广播:android

[英]unable to send and receive Broadcast from activity :android

我无法从一个活动向另一个活动发送广播,请参见下面的代码。 有两个按钮,一个用于发送广播,另一个用于接收广播。 我试过下面的代码。 但是,仅当我单击checkBrodcast按钮时,我的Receiver活动才会运行。

public class MainActivity extends Activity {

 protected void onCreate(Bundle savedInstanceState) {                   
    sendBrodcast = (Button) findViewById(R.id.send_brodcast);
    checkBrodcast = (Button) findViewById(R.id.check_brodcast);

        sendBrodcast.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                Log.w("Check", "inside send broadcast");
                Intent broadcast = new Intent();
                broadcast.setAction("BROADCAST_ACTION");
                broadcast.addCategory(Intent.CATEGORY_DEFAULT);
                sendBroadcast(broadcast);

            }
    });


    checkBrodcast.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                Intent intent = new Intent(MainActivity.this, Receiver.class); 
                startActivity(intent);
            }
    });

 }  
}

公共类Receiver扩展Activity {

BroadcastReceiver br = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            Log.w("Check", "Inside On Receiver");
            Toast.makeText(getApplicationContext(), "received",
                    Toast.LENGTH_LONG).show();
        }
   };


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    IntentFilter filter = new IntentFilter();
        filter.addAction("BROADCAST_ACTION");
        filter.addCategory(Intent.CATEGORY_DEFAULT);
        registerReceiver(br, filter);


}


@Override
protected void onPause() {
     super.onPause();
     unregisterReceiver(br);
}

}

您启动BroadCast的方式很好。 您只需要更改拦截此广播的方式即可。

启动广播

Intent broadcast = new Intent();
                broadcast.setAction("BROADCAST_ACTION");
                broadcast.addCategory(Intent.CATEGORY_DEFAULT);
                sendBroadcast(broadcast);

截取它

A)创建收货人

BroadcastReceiver br = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            Log.w("Check", "Inside On Receiver");
            Toast.makeText(getApplicationContext(), "received",
                    Toast.LENGTH_LONG).show();
        }
   };

B)注册收据-在onCreate活动中执行此操作

registerReceiver(br,new IntentFilter(“ BROADCAST_ACTION”));

以这种方式注册的广播接收器(单例声明且未显示)-除非正在运行包含应用程序,否则不会接收广播。 但是,正如您的情况一样,您正在触发广播消息onClick事件,因此该应用程序必须正在运行。 因此,我想可以肯定地假设使用此方法设置的接收器可以正常工作- 在您从其他活动触发广播之前, 前提 是您声明接收器的类已创建并且存在于活动堆栈中。

这是因为您没有在Android清单中声明广播接收器。 除非包含应用程序正在运行,否则动态注册的接收器很可能无法接收广播。

如果您希望第二个活动无需单击按钮即可启动应用程序以获取广播,则将适当的广播接收器添加到第二个活动android清单中。

如果要将数据从一个活动广播到另一个活动,只需使用Intent。 根据您的情况,只需在onClickListener()调用finish() ,然后在第二个活动的onDestroy方法中创建Intent对象,并将数据作为额外的intent广播,然后在onReceive()方法上使用intent.getExtra()方法您的broadcastReceiver类。

有关更多详细信息:请遵循本教程

问题出在您的清单上。 您必须像这样在清单中注册接收器:

    <receiver android:name="MyReceiver" >
        <intent-filter>
            <action android:name="com.android.mybroadcast" />
        </intent-filter>
    </receiver>

但是无论如何,就我个人而言,我不喜欢您如何构建广播接收器结构。 您应该创建一个从BroadcastReceiver扩展的类,如下所示:

 public class MyBroadcastReceiver extends BroadcastReceiver 
 {
   @Override
   public void onReceive(Context context, Intent intent) 
   {
      Toast.makeText(context, "Your receiver!!!!.",
      Toast.LENGTH_LONG).show();
   } 
 } 

不要忘记设置清单:

 <receiver android:name="MyBroadcastReceiver" >
    </receiver>

现在您的班级正在呼叫:

public class AlarmActivity extends Activity {

/** Called when the activity is first created. */

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

 public void startAlert(View view) 
 {    
     int i = Integer.parseInt(text.getText().toString());
     Intent intent = new Intent(this, MyBroadcastReceiver.class);
     PendingIntent pendingIntent =         
        PendingIntent.getBroadcast(this.getApplicationContext(), 234324243, intent, 0);

 }

}

那样的东西!!!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM