从BroadcastReceiver启动服务

时间:2012-07-03 22:18:35

标签: android android-intent broadcastreceiver intentservice

此相关应用的部分内容为IntentServiceDatabaseService)和AppWidgetProviderLotWidget)。在LotWidget中,当按下某个按钮时,会触发PendingIntent,它会向自己发送广播,并在onReceive()中收到。到目前为止,这一切都很好。在onReceive中,我从Intent以及各种附加内容中读取了操作,并从IntentService开始,或者开始主Activity。启动活动工作正常,但由于某些原因我无法理解,DatabaseService没有启动。我知道通过DatabaseService测试发送导致Log意图的代码。

以下是onReceive代码:

@Override
public void onReceive(Context context, Intent intent) {     
    super.onReceive(context, intent);
    if(intent.getAction().equals(RETURN_DATA_WIDGET) && initialize(context)){
        updateWidget(context);
    }
    else if(intent.getAction().equals(INTERNAL_INC)){
        Log.d("WIDG", "Incrememnt");
        Intent incr = new Intent(context, DatabaseService.class);
        incr.setAction(INCREMENT);
        incr.putExtra("incval", intent.getIntExtra("incval", 999));
        context.startService(intent);
    }
    else if(intent.getAction().equals(INTERNAL_UP)){
        Log.d("WIDG", "UPDATE");
        Intent upd = new Intent(context, DatabaseService.class);
        upd.setAction(UPDATE_COUNT);
        context.startService(intent);
    }
    else if(intent.getAction().equals(OPEN_APP)){
        Intent open = new Intent(context, TheLotActivity.class);
        open.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        context.startActivity(open);
    }
}

使用相同的意图从主DatabaseService启动Activity可以正常工作。我的清单将DatabaseService定义为Service,如此:

<service android:name="com.bsprague.thelot.DatabaseService" >
    </service>

我知道Service未启动,因为Log的{​​{1}}未显示onHandleIntent,但显示正常Intent从主Activity发送。 Android中是否存在我缺少的内容,因此您无法从Service启动BroadcastReceiver

1 个答案:

答案 0 :(得分:1)

您正在Intent上设置操作,而您的<intent-filter>没有该操作。您可以考虑使用setAction()来代替putExtra()来电。

没关系 - 正如您在评论中指出的那样,由于您正在指定组件,因此将忽略所有其他路由元素(例如,操作)。您更新的评论中的错误表明,您的Intent选择了错误的组件,LotWidget而不是DatabaseService