Java android广播接收器未按预期工作

Java android广播接收器未按预期工作,java,android,android-activity,broadcastreceiver,Java,Android,Android Activity,Broadcastreceiver,据我所知,这应该行得通。除非它没有:-/ 其想法是扩展我使用的所有活动类,包括一个BroadcastReceiver,当我发送Toast消息时,它会弹出Toast消息。此策略的最终结果是,异步工作者作业可以“自行发现”这是“最顶层”的形式(如果可用),然后通过toast向用户发布消息,尽管它是异步事件的一部分,但当我不选择(*)将上下文作为参数传递时 问题是:当我调用doDemo()时,会发生火灾事件(我得到 来自doDemo()的log.d),但接收事件从未触发 (*)这是必要的,这是全部目的

据我所知,这应该行得通。除非它没有:-/

其想法是扩展我使用的所有活动类,包括一个BroadcastReceiver,当我发送Toast消息时,它会弹出Toast消息。此策略的最终结果是,异步工作者作业可以“自行发现”这是“最顶层”的形式(如果可用),然后通过toast向用户发布消息,尽管它是异步事件的一部分,但当我不选择(*)将上下文作为参数传递时

问题是:当我调用doDemo()时,会发生火灾事件(我得到 来自doDemo()的
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”);如果需要,可以使用此设置来输入额外值。