我正在尝试将UI从Service传递/更新到活动。我收到的广播不是我发送的。有什么想法吗?
服务代码:
@Override
//binder returns NULL
public void onStart(Intent intent, int startId) {
// TODO Auto-generated method stub
super.onStart(intent, startId);
Intent i = new Intent();
i.putExtra("lol", "haha");
i.setAction(MYACTION);
sendBroadcast(i);
活动代码:
protected void onResume() {
// TODO Auto-generated method stub
super.onResume();
IntentFilter intentFilter = new IntentFilter(MYACTION);
registerReceiver(recv, intentFilter);
}
BroadcastReceiver recv = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
Intent getintent = getIntent();
String action = getintent.getAction();
//ACTION RECEIVED IS DIFFERENT FROM MYACTION. IT IS ACTION.MAIN
// VALUE RECEIVED IS NULL
String val = getintent.getStringExtra("lol");
}
我没有在清单中注册接收器。有必要吗?
正如评论中所述:我在广播接收器中没有收到相同的动作,而意图的值是NULL。
我做错了什么?
感谢您的帮助。
答案 0 :(得分:4)
您不需要使用getIntent
,因为它转换为Activity的意图,而不是广播的意图。因此,在您的情况下,您需要仅使用intent
来引用广播意图。并且确保在从bundle中读取所需值之前进行检查,因为您可能首先获得另一个广播,其中包含 lol 。
所以在你的广播接收器中,这样做:
....
String val = getintent.getStringExtra("lol");
if(val.equals("your_action_string"){
String val = intent.getStringExtra("lol"); //getIntent() replaced by intent
}
....
P.S。不,你不需要注册任何广播接收器,因为它是以编程方式创建和使用的
答案 1 :(得分:1)
如果您正在制作网络请求或扩展任务,我会查看异步任务。它使更新UI变得更容易。只需确保调用onPreExecute()和onPostExecute()来执行此操作。我不喜欢服务和接收器。
http://developer.android.com/reference/android/os/AsyncTask.html
答案 2 :(得分:0)
通过此链接,您会找到一些符合您要求的完整示例。how to pass data from broadcast to service?