如何从 WakefulBroadcastReceiver 调用 IntentService

How to call IntentService from WakefulBroadcastReceiver

我有一个 IntentService 定义如下:

<service android:name=".service.AppService" android:process=":app_process" android:icon="@mipmap/ic_launcher" />

我有一个 WakefulBroadcastReceiver 接收一些数据,我想调用上面已经 运行 的服务。上面的服务一直是运行,即使杀掉了,也重启了。我如何向它传递消息?

我阅读了以下内容:

http://www.mysamplecode.com/2011/10/android-intentservice-example-using.html

http://www.truiton.com/2014/09/android-service-broadcastreceiver-example/

http://developer.android.com/guide/components/services.html

我尝试了 startServicePendingIntent 等,但似乎没有任何效果。

首先,请记住 IntentService 在不同的工作线程中工作,因为不可能与调用它的 Activity 进行相互通信。这就是为什么我们大多使用它们在不需要向用户反馈的后台进行同步。但是,如果您想将一些信息传递给 Activity,您必须像您所说的那样使用 BroadcastReceiver,并从那里创建将 "data" 发送到 Activity 的 Intent。

回到你的问题,你必须在 AndroidManifest.xml 中的 <application> 标签内添加服务和接收器

<service android:name=".AppService"
  android:enabled="true"/>
<receiver android:name=".WakefulBroadcastReceiver" >
</receiver>

然后在您的 Activity 中像这样启动服务(当您需要时,在 onCreate 或按钮侦听器中)

IntentFilter filter = new IntentFilter(WakefulBroadcastReceiver.ACTION_RESP);
filter.addCategory(Intent.CATEGORY_DEFAULT);
WakefulBroadcastReceiver broadcastReceiver = new WakefulBroadcastReceiver();
registerReceiver(broadcastReceiver, filter);

在您的 BroadcastReceiver 中,您重写了 onReceive() 方法,如下所示:

@Override
public void onReceive(Context context, Intent intent) {
    // HERE IS WHERE YOU RECEIVE THE INFORMATION FROM THE INTENTSERVICE, FROM HERE YOU CAN START AN ACTIVITY OR WHATEVER YOU AIM
    Toast.makeText(context, "IntentService Broadcasting", Toast.LENGTH_SHORT).show();
}

同样在同一个 BroadcastReceiver 中添加这个标识 intentfilter 的变量:

public static final String ACTION_RESP = "MY_FILTER_NAME"

在您的 IntentService class 中,您必须像这样覆盖 onHandleIntent() 方法:

@Override
protected void onHandleIntent(Intent intent) {
    String msg = intent.getStringExtra("MSG");
    Intent broadcast = new Intent();
    broadcast.setAction(WakefulBroadcastReceiver.ACTION_RESP);
    broadcast.addCategory(Intent.CATEGORY_DEFAULT);
    broadcast.putExtra("MSG", resultTxt);
    // HERE IS WHERE YOU SEND THE INFORMATION YOU LOADED TO THE APP
    sendBroadcast(broadcast);
}

我的 GitHub 帐户中有一个演示项目,我在其中使用绑定和未绑定服务以及 IntentServices: https://github.com/isaacurbina/PermissionsAndServices

希望对您有所帮助。

亲切的问候!

您可以在扩展 WakefulBroadcastReceiver 的 class 中编写:

@Override
    public void onReceive(Context context, Intent intent) {
    Intent gcmIntent = new Intent(context, MessageService.class);
    gcmIntent.putExtras(intent.getExtras());
    startWakefulService(context, gcmIntent);
    setResultCode(Activity.RESULT_OK);
}

并在扩展 IntentService 的 class 中写入:

@Override
    protected void onHandleIntent(Intent intent) {
        Bundle bundle = intent.getExtras();
        //do sth with that data
        MessageReceiver.completeWakefulIntent(intent);
    }