通信可以使用 完成PendingIntent.For我们可以使用 createPendingResult() .createPendi ngResult()创建一个新的PendingIntent对象,您可以交给服务使用并将结果数据发送回onActivityResult(int,int, Intent)callback中的活动。由于PendingIntent是Parcelable,因此可以将 进入一个意图额外,您的活动可以将这个 PendingIntent传递给该服务。该服务反过来可以调用PendingIntent上的send() 方法来通过 onActivityResult通知该活动的一个事件。
活动
public class PendingIntentActivity extends AppCompatActivity
{
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
PendingIntent pendingResult = createPendingResult(
100, new Intent(), 0);
Intent intent = new Intent(getApplicationContext(), PendingIntentService.class);
intent.putExtra("pendingIntent", pendingResult);
startService(intent);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == 100 && resultCode==200) {
Toast.makeText(this,data.getStringExtra("name"),Toast.LENGTH_LONG).show();
}
super.onActivityResult(requestCode, resultCode, data);
}
}
服务
public class PendingIntentService extends Service {
private static final String[] items= { "lorem", "ipsum", "dolor",
"sit", "amet", "consectetuer", "adipiscing", "elit", "morbi",
"vel", "ligula", "vitae", "arcu", "aliquet", "mollis", "etiam",
"vel", "erat", "placerat", "ante", "porttitor", "sodales",
"pellentesque", "augue", "purus" };
private PendingIntent data;
@Override
public void onCreate() {
super.onCreate();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
data = intent.getParcelableExtra("pendingIntent");
new LoadWordsThread().start();
return START_NOT_STICKY;
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onDestroy() {
super.onDestroy();
}
class LoadWordsThread extends Thread {
@Override
public void run() {
for (String item : items) {
if (!isInterrupted()) {
Intent result = new Intent();
result.putExtra("name", item);
try {
data.send(PendingIntentService.this,200,result);
} catch (PendingIntent.CanceledException e) {
e.printStackTrace();
}
SystemClock.sleep(400);
}
}
}
}
}
为什么不直接调用从服务的广播接收器。所有这些只是为了隐藏ServiceReader的名称? – Kiran 2015-05-12 09:19:18
需要在这里创建处理程序是什么?我们可以在onStart()中发送广播。 – 2016-08-04 14:10:34
@RohitBandil'服务'在UI线程上运行,因此在那里执行后台操作并发送结果会挫败后台服务的目的。 'IntentService'旨在隐藏你的Handler复杂性;不知道为什么@Ramps不使用它。 – TWiStErRob 2016-09-07 20:50:32