這次在公司做了一次計步器诚啃,因為需要一個進程來記錄步數(shù)的更新淮摔,這個場景下使用多進程通信是合適的。
安卓多進程只要在menifest中做聲明即可始赎,android:process這句就是聲明該service在不同進程和橙,因為這個service只需要一個實例并且應(yīng)該長久在后臺運行,所以launchMode="singleInstance",android:priority=1000表示優(yōu)先級最高:
<service
android:name="PedometerStepService"
android:enabled="true"
android:exported="false"
android:launchMode="singleInstance"
android:priority="1000"
android:process=":todaystep"
</service>
這個進程有下面幾件事情要做:
- 監(jiān)聽手機傳感器傳遞來的數(shù)據(jù)
- 監(jiān)聽App主進程傳遞過來的數(shù)據(jù)(AIDL和contentProvider)
- 為App計步器工具頁提供步數(shù)更新數(shù)據(jù)
- 初始化notification和更新notification(這個notification主要是
在通知欄上給用戶直觀的提供步數(shù)更新數(shù)據(jù)造垛,有些應(yīng)用還提供卡
路里數(shù)據(jù))
有這么個需求:在activity中要得到service對象調(diào)用對象的方法魔招,但同時又不希望activity finish的時候service也被destory了
這種情況下我們使用先bindService后startService來執(zhí)行,生命周期是oncreate->onBind->onStartCommand實現(xiàn)原理是:只要還有一種啟動方法存在五辽,Service就會繼續(xù)存活办斑。
Activity退出的時候我們肯定要在ondestroy的時候unbindService,不然會引起泄露,但是只要我們不調(diào)用stopService那么service就不會被殺死杆逗。
在進程onStartCommand的方法里我們要返回START_STICKY乡翅,表示Service運行的進程被Android系統(tǒng)強制殺掉之后,Android系統(tǒng)會將該Service依然設(shè)置為started狀態(tài)(即運行狀態(tài))
多進程通信髓迎,這里不推薦使用sharepreference,因為sharepreference對多進程支持的很差峦朗,我們可以使用contentProvide來進行進程通信:
在進程的oncreate里我們注冊對特定uri的監(jiān)聽:
Uri notificationEnabledUri = Uri.parse("content://" + PedometerProvider.authory + "/notification/");
mNotificationObserver = new NotificationObserver(new Handler());
getContentResolver().registerContentObserver(notificationEnabledUri, true, mNotificationObserver);
class NotificationObserver extends ContentObserver {
public NotificationObserver(Handler handler) {
super(handler);
}
@Override
public void onChange(boolean selfChange, Uri uri) {
super.onChange(selfChange, uri);
LogUtil.d("TAG", ">>>onchange uri=" + uri);
String id = uri.getLastPathSegment();
String queryValue = uri.getQueryParameter(PemometerConstant.CONTPROVIDER_URI_QUERY);
}
}
發(fā)送Uri的地方這么寫:
public static void notifyredPackageChanged(Context context,int shouldShowRedPackage) {
Uri uri = Uri.parse("content://com.babytree.apps.pregnancy.PedometerProvider/notification?"+PemometerConstant.CONTPROVIDER_URI_QUERY+
"="+ PemometerConstant.CONTPROVIDER_URI_QUERY_VALUE_RED_PACKAGE);
Uri resultUri = ContentUris.withAppendedId(uri, shouldShowRedPackage);
ContentResolver resolver = context.getContentResolver();
resolver.notifyChange(resultUri, null);
}