標籤:textview tco dem logs false 廣播 ati 時間 mint
實現邏輯如下:
左側為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. 廣播發送的時間不確定性因素,導致資料互動有延時;
(Android資料傳遞)Service和Activity之間-- 藉助BroadcastReceiver--的資料傳遞