通信可以使用 完成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