【问题标题】:Android: Broadcast Receiver and Service issuesAndroid:广播接收器和服务问题
【发布时间】:2012-04-28 22:18:33
【问题描述】:

我编写了一个简单的活动来测试服务和广播接收器以及与之配套的服务。为了知道它是否正常工作,我在主要活动中设置了一个 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;
}

}

【问题讨论】:

    标签: android service android-intent broadcast


    【解决方案1】:

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

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

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

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

    更新

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

    另外,在覆盖方法时使用@Override,以帮助您发现这类问题。

    【讨论】:

    • 我按照您的建议做了,从按钮启动服务并在启动服务之前注册接收器,但它似乎仍然无法正常工作。还有其他建议吗?
    • @rodkarom:我没想到。 FWIW,这是LocalBroadcastManager 的示例使用,其设置与您的设置几乎相同(尽管我使用TextView 而不是Toast)。您可能会暂时摆脱setGravity() 以简化Toast,以防万一搞砸了——我很少改变我的Toast 重力。
    • 还有一个疑问...我需要在我的 AndroidManifest.xml 中声明一个意图过滤器吗?
    • @rodkarom:当你使用registerReceiver()时不会。
    • 很抱歉打扰您,但我可能已经想通了。我使用 Log.d 来记录何时调用服务的 OnCreate 和 OnStart 方法并且从不调用 OnStart 方法。知道为什么会这样吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多