0

我编写了一个简单的活动来测试服务和广播接收器以及与之配套的服务。为了知道它是否正常工作,我在主要活动中设置了一个 Toast,以便在调用 OnReceive() 方法后显示。但对于我的生活,我无法让它发挥作用。

这些是代码:

公共类 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);        
}

}

公共类 serviceD 扩展服务{

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

}

4

1 回答 1

1

startService()之前打过电话registerReceiver()。两者都是异步操作,但它们仍然可能按顺序发生。因此,onStart()您的服务将在registerReceiver()其工作之前被调用,这意味着您的广播在您的接收器设置之前就结束了。

对于这种实验,我建议设置一个基本的 UI(例如,一个非常大的按钮)并在startService()按下按钮时进行调用。

此外,由于服务调用stopSelf(),您不需要stopService()从活动中调用。

此外,您可能会考虑LocalBroadcastManager为此使用相同的基本语法,具有更好的性能和安全性,因为它都保留在您的流程中。

更新

此外,也onStart()已被弃用两年多,无论如何,您的方法签名是错误的。请使用onStartCommand(), 和正确的参数。

也同样,@Override在覆盖方法时使用,以帮助您捕捉这些问题。

于 2012-04-28T22:22:06.707 回答