實現邏輯如下:
左側為Activity中的執行邏輯,右側為Service中的執行邏輯:

/**
* <功能描述> Service和Activity之間的數據交互;具體表現為: 1. 從Service獲取數據源,傳遞到Activity中; 2.
* 在Activity中作數據更新; 3. Service中的onCreate()在UI線程中執行,作延時需要在子線程中執行;
*
* @author Administrator
*/
public class MainActivity extends Activity {
private static final String TAG = "Demo";
private TextView mTvContent;
private Intent mIntent;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
initView();
registerReceiver();
initData();
}
/**
* <功能描述> 初始化視圖
*
* @return void [返回類型說明]
*/
private void initView() {
setContentView(R.layout.activity_main);
mTvContent = (TextView) findViewById(R.id.tv_data);
}
/**
* <功能描述> 初始化數據
*
* @return void [返回類型說明]
*/
private void initData() {
mIntent = new Intent(MainActivity.this, CountService.class);
startService(mIntent);
}
/**
* <功能描述> 注冊廣播
*
* @return void [返回類型說明]
*/
private void registerReceiver() {
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("com.spt.activity.CountService");
MainActivity.this.registerReceiver(new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
Bundle bundle = intent.getExtras();
mTvContent.setText(bundle
.getInt("com.spt.CountService.count_data") + "");
Log.d(TAG, "count_data=" + mTvContent.getText());
}
}, intentFilter);
}
@Override
protected void onDestroy() {
super.onDestroy();
if (true) {
stopService(mIntent);
}
}
}
需要在MainActivity中注冊能夠接收Service發送的數據更新廣播:com.spt.activity.CountService;並獲取到更新后的數據,顯示即可。
還需要注意的是:開啟服務后,還要停止服務。否則該服務會一直在后台運行。
還發現,使用這種方式同樣能夠停止該Service:
stopService(new Intent(MainActivity.this, CountService.class));
CountService服務代碼如下:
public class CountService extends Service {
private int countService = 0;
private boolean isServiceRunning = false;
@Override
public void onCreate() {
super.onCreate();
isServiceRunning = true;
// 創建子線程作計數
new Thread(new Runnable() {
@Override
public void run() {
while (isServiceRunning) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
countService++;
Intent intent = new Intent();
intent.putExtra("com.spt.CountService.count_data", countService);
intent.setAction("com.spt.activity.CountService");
// Service中發送廣播
sendBroadcast(intent);
}
}
}).start();
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onDestroy() {
super.onDestroy();
isServiceRunning = false;
countService = 0;
}
}
總結和疑問:
1. 使用Broadcast廣播方式實現服務和宿主之間的數據交互,容易造成性能不高的問題;
2. 廣播發送的時間不確定性因素,導致數據交互有延時;
