Java android广播接收器未按预期工作
据我所知,这应该行得通。除非它没有:-/ 其想法是扩展我使用的所有活动类,包括一个BroadcastReceiver,当我发送Toast消息时,它会弹出Toast消息。此策略的最终结果是,异步工作者作业可以“自行发现”这是“最顶层”的形式(如果可用),然后通过toast向用户发布消息,尽管它是异步事件的一部分,但当我不选择(*)将上下文作为参数传递时 问题是:当我调用doDemo()时,会发生火灾事件(我得到 来自doDemo()的Java android广播接收器未按预期工作,java,android,android-activity,broadcastreceiver,Java,Android,Android Activity,Broadcastreceiver,据我所知,这应该行得通。除非它没有:-/ 其想法是扩展我使用的所有活动类,包括一个BroadcastReceiver,当我发送Toast消息时,它会弹出Toast消息。此策略的最终结果是,异步工作者作业可以“自行发现”这是“最顶层”的形式(如果可用),然后通过toast向用户发布消息,尽管它是异步事件的一部分,但当我不选择(*)将上下文作为参数传递时 问题是:当我调用doDemo()时,会发生火灾事件(我得到 来自doDemo()的log.d),但接收事件从未触发 (*)这是必要的,这是全部目的
log.d
),但接收事件从未触发
(*)这是必要的,这是全部目的
public class ToastActivity extends Activity{
private BroadcastReceiver ToastBroadCastReceiver = new BroadcastReceiver() {
@Override
public void onReceive( Context context, Intent intent ) {
Toast.makeText(getApplicationContext(), intent.getAction() + " package: "+ intent.getPackage(), Toast.LENGTH_SHORT).show();
Log.d("ToastBroadCastReceiver", "Broadcastreceiver: " + intent.getAction() + " package: "+ intent.getPackage() + " @" + System.currentTimeMillis());
}
};
public void onResume() {
super.onResume();
registerReceiver(ToastBroadCastReceiver, new IntentFilter("com.my.domain.BROADCAST"));
}
public void onPause() {
super.onPause();
unregisterReceiver(ToastBroadCastReceiver);
}
public void doDemo(){
Log.d("ToastBroadCastReceiver", "doDemo Broadcast started" );
Intent broadCastIntent = new Intent();
broadCastIntent.setAction( "com.my.domain.BROADCAST");
broadCastIntent.setPackage( "well hello test!" );
sendBroadcast(broadCastIntent);
Log.d("ToastBroadCastReceiver", "doDemo Broadcast sent" );
}
}
registerReceiver(ToastBroadCastReceiver, new IntentFilter("com.my.domain.BROADCAST"));
编辑
在与阿里进行了长时间的交谈后,我们想到了这一点
public class ToastActivity extends Activity{
private BroadcastReceiver ToastBroadCastReceiver = new BroadcastReceiver() {
@Override
public void onReceive( Context context, Intent intent ) {
if (intent.getAction().equals("TOASTMESSAGE")) {
String message = "";
Bundle extras = intent.getExtras();
if (extras != null) {
message = extras.getString("message");
}
Toast.makeText(getApplicationContext(), message, Toast.LENGTH_SHORT).show();
Log.d("ToastBroadCastReceiver", "Broadcastreceiver: " + message + "|" + intent.getAction());
}
}
};
public void ToastRegister(){
registerReceiver(ToastBroadCastReceiver, new IntentFilter("TOASTMESSAGE"));
}
public void ToastDeRegister(){
try {
unregisterReceiver(ToastBroadCastReceiver);
}
catch (Exception e) {
Log.e("ToastBroadCastReceiver", e.getMessage());
}
}
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ToastRegister();
}
public void onResume() {
super.onResume();
ToastRegister();
}
public void onPause() {
super.onPause();
ToastDeRegister();
}
public void onDestroy() {
super.onDestroy();
ToastDeRegister();
}
public void doDemo(){
Log.d("ToastBroadCastReceiver", "doDemo Broadcast started" );
Intent broadCastIntent = new Intent();
broadCastIntent.setAction("TOASTMESSAGE");
broadCastIntent.putExtra("message","hello test message!");
sendBroadcast(broadCastIntent);
Log.d("ToastBroadCastReceiver", "doDemo Broadcast sent" );
}
}
这一行就是问题
broadCastIntent.setPackage(“wellHelloTest!”)代码>
像这样编辑代码
broadCastIntent.setPackage( "com.my.domain.BROADCAST");
broadCastIntent.setAction( "well hello test!" );
同时替换您的此行
public class ToastActivity extends Activity{
private BroadcastReceiver ToastBroadCastReceiver = new BroadcastReceiver() {
@Override
public void onReceive( Context context, Intent intent ) {
Toast.makeText(getApplicationContext(), intent.getAction() + " package: "+ intent.getPackage(), Toast.LENGTH_SHORT).show();
Log.d("ToastBroadCastReceiver", "Broadcastreceiver: " + intent.getAction() + " package: "+ intent.getPackage() + " @" + System.currentTimeMillis());
}
};
public void onResume() {
super.onResume();
registerReceiver(ToastBroadCastReceiver, new IntentFilter("com.my.domain.BROADCAST"));
}
public void onPause() {
super.onPause();
unregisterReceiver(ToastBroadCastReceiver);
}
public void doDemo(){
Log.d("ToastBroadCastReceiver", "doDemo Broadcast started" );
Intent broadCastIntent = new Intent();
broadCastIntent.setAction( "com.my.domain.BROADCAST");
broadCastIntent.setPackage( "well hello test!" );
sendBroadcast(broadCastIntent);
Log.d("ToastBroadCastReceiver", "doDemo Broadcast sent" );
}
}
registerReceiver(ToastBroadCastReceiver, new IntentFilter("com.my.domain.BROADCAST"));
用这个
registerReceiver(ToastBroadCastReceiver, new IntentFilter("well hello test!"));
if (intent.getAction().equals("well hello test!")) {
Update_chat_counter();
在您的onReceive中,您可以这样做
registerReceiver(ToastBroadCastReceiver, new IntentFilter("well hello test!"));
if (intent.getAction().equals("well hello test!")) {
Update_chat_counter();
的确程序包需要与你的应用程序包匹配,否则你无法接收广播。好吧,我很困惑-我如何发送消息“well hello test”并正确过滤/打包-我想通过com.my.domain.broadcast进行打包/筛选我知道了,但这不会简单地过滤(并且仅过滤)带有操作的内容我想做的是监听消息(例如:一个字符串说“well hello test!”),我不想测试该文本well hello test代码>。。。忘记那个文本字符串吧,它只是一个字符串,它是一个lorem ipsum
文本可以是任何东西,它是toast
文本。啊,这太令人困惑了。。我希望能够接收我选择的任何文本字符串(作为目的),并通过侦听器捕获它:-(…我是否应该使用setData
?broadCastIntent.putExtra(“key”,“Value”);如果需要,可以使用此设置来输入额外值。