我编写了一个简单的活动来测试服务和广播接收器以及与之配合使用的服务。为了知道它是否正常工作,我在调用OnReceive()方法后要在主要活动中设置Toast。但是对于我的生活,我无法让它发挥作用。
这些是代码:
公共类ServicesAndBroadcastIntentActivity扩展了Activity {
private Toast test;
private Intent intent;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
intent = new Intent(this,serviceD.class);
test = Toast.makeText(this,"Test",Toast.LENGTH_LONG);
test.setGravity(Gravity.CENTER,0,0);
}
private BroadcastReceiver broadcastReceiver = new BroadcastReceiver(){
@Override
public void onReceive(Context context, Intent intent) {
test.setText((intent.getStringExtra("EXTRA_MSG")));
test.show();
}
};
@Override
public void onResume(){
super.onResume();
startService(intent);
registerReceiver(broadcastReceiver, new IntentFilter(serviceD.BROADCAST_ACTION));
}
@Override
public void onPause() {
super.onPause();
unregisterReceiver(broadcastReceiver);
stopService(intent);
}
}
public class serviceD extends Service {
private Intent intent;
static final String BROADCAST_ACTION = "com.mejg.ServicesAndBroadcastIntent";
public void onCreate() {
super.onCreate();
intent = new Intent(BROADCAST_ACTION);
}
public void onStart(){
intent.putExtra("EXTRA_MSG","hola");
sendBroadcast(intent);
stopSelf();
}
@Override
public IBinder onBind(Intent arg0) {
// TODO Auto-generated method stub
return null;
}
}
答案 0 :(得分:1)
您在startService()
之前致电registerReceiver()
。两者都是异步操作,但它们仍可能按顺序发生。因此,在onStart()
完成其工作之前,系统会调用registerReceiver()
您的服务,这意味着您的广播会在您的接收器设置之前熄灭。
对于这种实验,我建议设置一个基本用户界面(例如,一个非常大的按钮),并在按下按钮时进行startService()
调用。
此外,由于服务呼叫stopSelf()
,您无需从活动中呼叫stopService()
。
另外,您可以考虑使用LocalBroadcastManager
- 相同的基本语法,具有更好的性能和安全性,因为它们都在您的流程中。
<强>更新强>
另外,onStart()
已被弃用了两年以上,无论如何,你的方法签名都是错误的。请使用onStartCommand()
,并使用正确的参数。
另外,还可以在覆盖方法时使用@Override
来帮助您捕获这些问题。