我无法将广播从一个活动发送到其他活动,请参阅下面的代码。有两个按钮用于发送广播,另一个用于接收广播。我试过以下代码。但是,只有当我点击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);
}
}
答案 0 :(得分:1)
启动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)注册接收器 - 在创建活动回叫
上执行此操作registerReceiver(br,new IntentFilter(" BROADCAST_ACTION"));
以这种方式注册的广播接收器(SINGLETON DECLARATION而不是MANIFEST) - 除非包含应用程序正在运行,否则不接收广播。但是在您的情况下,您正在触发onClick事件的广播消息,因此应用程序必须正在运行。所以我认为可以安全地假设你的接收器使用这种方法设置,可以正常工作 - 提供 你声明你的接收器被创建并存在于活动堆栈中的类,之前你从另一个活动发射广播。
答案 1 :(得分:0)
这是因为您没有在Android Manifest中声明您的广播接收器。除非包含应用程序正在运行,否则动态注册的接收器不会接收广播。
如果你想让第二个活动获得广播而不必点击按钮来启动应用程序,那么将适当的广播接收器添加到第二个活动android清单。
答案 2 :(得分:0)
如果要将数据从一个活动广播到另一个活动,只需使用Intent即可。根据您的情况,只需在finish()
中调用onClickListener()
,然后在第二个活动的onDestroy
方法中创建Intent对象并广播数据作为额外的意图,然后使用{{1} } intent.getExtra()
类的onReceive()
方法上的方法。
了解更多详情: follow this tutorial
答案 3 :(得分:-1)
问题在于您的清单。你必须在你的Manifest中注册你的接收器:
<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);
}
}
这样的东西!!!