几个月前提出了问题,但如果有人仍在寻找答案,我希望我能提供帮助。
在下面的示例中,我们有本地服务,负责执行一些耗时的操作。Activity 向服务发出请求,但不绑定到它 - 只是发送带有请求的意图。此外,Activity 包含了 BroadcastReceiver 的信息,当服务完成请求的任务时应该回调该信息。信息由 PendingIntent 传递。该服务在后台线程中处理任务,当任务完成时,服务会广播带有答案的 BroadcastReceiver。
1.创建BroadcastReceiver子类:
public class DataBroadcastReceiver extends BroadcastReceiver {
static Logger log = LoggerFactory.getLogger(DataRequestService.class);
@Override
public void onReceive(Context context, Intent intent) {
log.info(" onReceive");
}
}
当任务完成时,该广播接收器将收到服务通知。
2. 创建服务
public class DataRequestService extends Service {
private final class ServiceHandler extends Handler {
public ServiceHandler(Looper looper) {
super(looper);
}
@Override
public void handleMessage(Message msg) {
log.info("handleMessage");
//... performing some time-consuming operation
Bundle bundle = msg.getData();
PendingIntent receiver = bundle.getParcelable("receiver");
// Perform the operation associated with PendingIntent
try {
//you can attach data from the operation in the intent.
Intent intent = new Intent();
Bundle b = new Bundle();
//b.putString("key", value);
intent.putExtras(b);
receiver.send(getApplicationContext(), status, intent);
} catch (CanceledException e) {
e.printStackTrace();
}
}
}
@Override
public void onStart(Intent intent, int startId) {
Bundle bundle = intent.getExtras();
Message msg = mServiceHandler.obtainMessage();
msg.setData(bundle);
mServiceHandler.sendMessage(msg);
}
好吧,最重要的部分是在 handleMessage() 方法中。服务只是进行广播操作以将结果传递给广播接收器。
3.你还需要在Manifest.xml中注册你的广播接收器和服务
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.ramps.servicetest"
android:versionCode="1"
android:versionName="1.0" >
....
<service android:name=".service.DataRequestService" android:exported="false"/>
<receiver android:name=".service.DataBroadcastReceiver"></receiver>
</application>
</manifest><br>
4. 最后,从 Activity 向您的服务发出请求:
Intent serviceIntent = new Intent(context, DataRequestService.class);
@Override
public void onClick(View v) {
//this is the intent that will be broadcasted by service.
Intent broadcastReceiverIntent = new Intent(context, DataBroadcastReceiver.class);
//create pending intent for broadcasting the DataBroadcastReceiver
PendingIntent pi = PendingIntent.getBroadcast(context, 0, broadcastReceiverIntent, 0);
Bundle bundle = new Bundle();
bundle.putParcelable("receiver", pi);
//we want to start our service (for handling our time-consuming operation)
Intent serviceIntent = new Intent(context, DataRequestService.class);
serviceIntent.putExtras(bundle);
context.startService(serviceIntent);
}
5. 响应原始客户/活动。
您可以拥有抽象活动,您的所有活动都将从中扩展。这个抽象活动可以自动注册/注销自己作为广播接收器中的响应侦听器。实际上这里的选项并不多,但重要的是,如果您保留对活动的静态引用,那么您必须在活动被销毁时删除引用。
问候,
坡道