美文网首页
Android计步器中多进程的应用

Android计步器中多进程的应用

作者: nickgao | 来源:发表于2018-05-18 07:49 被阅读0次

    这次在公司做了一次计步器,因为需要一个进程来记录步数的更新,这个场景下使用多进程通信是合适的。

    安卓多进程只要在menifest中做声明即可,android:process这句就是声明该service在不同进程,因为这个service只需要一个实例并且应该长久在后台运行,所以launchMode="singleInstance",android:priority=1000表示优先级最高:

      <service
            android:name="PedometerStepService"
            android:enabled="true"
            android:exported="false"
            android:launchMode="singleInstance"
            android:priority="1000"
            android:process=":todaystep"
        </service>
    

    这个进程有下面几件事情要做:

    1. 监听手机传感器传递来的数据
    2. 监听App主进程传递过来的数据(AIDL和contentProvider)
    3. 为App计步器工具页提供步数更新数据
    4. 初始化notification和更新notification(这个notification主要是
      在通知栏上给用户直观的提供步数更新数据,有些应用还提供卡
      路里数据)

    有这么个需求:在activity中要得到service对象调用对象的方法,但同时又不希望activity finish的时候service也被destory了

    这种情况下我们使用先bindService后startService来执行,生命周期是oncreate->onBind->onStartCommand实现原理是:只要还有一种启动方法存在,Service就会继续存活。
    Activity退出的时候我们肯定要在ondestroy的时候unbindService,不然会引起泄露,但是只要我们不调用stopService那么service就不会被杀死。


    在进程onStartCommand的方法里我们要返回START_STICKY,表示Service运行的进程被Android系统强制杀掉之后,Android系统会将该Service依然设置为started状态(即运行状态)


    多进程通信,这里不推荐使用sharepreference,因为sharepreference对多进程支持的很差,我们可以使用contentProvide来进行进程通信:

    在进程的oncreate里我们注册对特定uri的监听:

    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);
            }
        }
    

    发送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);
        }
    
    

    相关文章

      网友评论

          本文标题:Android计步器中多进程的应用

          本文链接:https://www.haomeiwen.com/subject/cyjwdftx.html