1

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

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

问题:当我调用 doDemo() 时,会发生火灾事件(我 log.d从 doDemo() 获取)但接收事件永远不会触发。

(*)这是必不可少的,这是整个目的

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" );
    }

}

编辑

经过与阿里的长时间交谈,这就是我们想出的

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" );
    }

}
4

1 回答 1

2

这条线是问题 broadCastIntent.setPackage( "well hello test!" );

像这样编辑您的代码

 broadCastIntent.setPackage( "com.my.domain.BROADCAST");
 broadCastIntent.setAction( "well hello test!" );  

也替换你的这条线

 registerReceiver(ToastBroadCastReceiver, new IntentFilter("com.my.domain.BROADCAST"));

有了这个

 registerReceiver(ToastBroadCastReceiver, new IntentFilter("well hello test!"));

在你的 onReceive 中这样做

if (intent.getAction().equals("well hello test!")) {
                Update_chat_counter();
于 2012-12-08T15:36:50.587 回答