What is the simplest way to send message from local service to activity

匿名 (未验证) 提交于 2019-12-03 01:25:01

问题:

I have a service which is listening to the phone. When the phone goes IDLE, I want to send a message to my Activity. It looks like I have two options to accomplish this. BroadcastReceiver and binding to the Service. BroadcastReceiver looked like an easier mechanism, so I tried the following test.

In my Activity:

@Override protected void onStart() {     super.onStart();     IntentFilter filter = new IntentFilter("MyAction");     registerReceiver(new BroadcastReceiver() {         @Override         public void onReceive(Context context, Intent intent) {             Log.d(TAG, "Yay.......");             abortBroadcast();         }     }, filter); } 

In my Service which is listening for events, when I detect my desired event:

    Intent localIntent = new Intent(_context, MainActivity.class);     intent.setAction("MyAction");     _context.sendOrderedBroadcast(localIntent, null); 

In my test, the onReceive() method is never called after I have watched the broadcast being sent with the debugger. What am I missing? Also, is a BroadcastReceiver the simplest way for a local service to communicate with an Activity?

回答1:

I think I had a few problems in my initial test case. 1. When I created my Intent in my service, it should take the "action" as the argument. 2. I believe that I needed to add the intent filter to my manifest.

My working example now is:

Activity:

        startService(intent);          IntentFilter filter = new IntentFilter(PhoneListeningService.PHONE_IDLE);         registerReceiver(new BroadcastReceiver() {             @Override             public void onReceive(Context context, Intent intent) {                 Log.d(TAG, "Yay.......");             }         }, filter); 

Manifest:

    

Service:

Declare public constant for the named "action" and broadcast an intent.

public static final String PHONE_IDLE = "com.ncc.PhoneListeningService.action.PHONE_IDLE"; 

... my listener detects phone idle:

            Intent intent = new Intent(PHONE_IDLE);             sendBroadcast(intent); 


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!