Android SDK

来自ixintui推送文档
跳转至: 导航搜索

Android Push SDK 1.9.4版开发手册。
Android Push服务主要包括推送功能,请参考使用步骤和demo源码将其成功集成到您的工程中。

容易发生的集成问题,请务必仔细检查:

1. 请检查layout目录下的资源文件是否放入正确的工程目录中,务必确保不要遗漏文件。
2. V1.9.4版本后drawable下增加ixintui_small_icon.png,该图标为状态栏小图标,请设计并替换成自己应用icon,图标要求:只使用alpha图层,不能包括RGB图层(图标不能有颜色,参考默认图标设计),否则为爱心推默认图标,爱心推只提供了48x48 px图标,请自行适配。
3. V1.9.4版本后要求应用必须有v4包(android-support-v4.jar)。
4. 请检查在AndroidManifest.xml文件中权限是否添加完整,receiver、activity、service和provider是否配置正确,务必对照最新文档确保修改完整。
5. 请检查本地是否实现了一个BroadcastReceiver派生类。
6. 请检查混淆的配置文件是否正确添加keep代码,以避免SDK被二次混淆编译,同时避免使用-allowaccessmodification选项。
7. 如果之前您集成过旧版本推送sdk,请将旧版本的so和jar包等文件删除。


引入jar包及资源文件

--将sdk/libs目录下ixintui_pushsdk_vx.y.z.jar包放入工程指定的libs目录。
--将sdk/layout目录下的资源文件放入您工程中相应的资源目录layout中
--将sdk/values目录下的资源文件放入您工程中相应的资源目录values中
--将sdk/drawable目录下的资源文件放入您工程中相应的资源目录drawable中
--将sdk/xml目录下的资源文件放入您工程中相应的资源目录xml中,如没有请创建xml目录,放入./xml/ixintui_deamon.xml和./xml/ixintui_sync.xml文件。

将ixintui_sync文件中的yourpackage修改为您自己应用的包名:
ixintui_sync.xml:

<?xml version="1.0" encoding="utf-8"?>
<sync-adapter xmlns:android="http://schemas.android.com/apk/res/android"
   android:accountType="com.ixintui.push.account"
   android:allowParallelSyncs="true"
   <-- 请将packagename修改为您自己的包名-->
   android:contentAuthority="yourpackage.provider"
   android:isAlwaysSyncable="true"
   android:supportsUploading="false"
   android:userVisible="true" />

注意:如果您使用过之前版本的sdk,请将之前的so和jar包全部删除。请务必确保不要遗漏layout文件,否则可能造成服务工作不正常。

AndroidManifest

1 请确保您的应用具有以下Permission权限:
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
 <uses-permission android:name="android.permission.GET_TASKS" />
 <uses-permission android:name="android.permission.INTERNET" />
 <uses-permission android:name="android.permission.READ_PHONE_STATE" />
 <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
 <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
 <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
 <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
 <uses-permission android:name="android.permission.VIBRATE" />
 <uses-permission android:name="android.permission.WAKE_LOCK"/>
 <uses-permission android:name="android.permission.REORDER_TASKS" />
 <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
 <uses-permission android:name="android.permission.AUTHENTICATE_ACCOUNTS" />
 <uses-permission android:name="android.permission.READ_SYNC_SETTINGS" />
 <uses-permission android:name="android.permission.WRITE_SYNC_SETTINGS" />
 <uses-permission android:name="android.permission.GET_ACCOUNTS" />
 <uses-permission android:name="com.sec.android.provider.badge.permission.READ" />
 <uses-permission android:name="com.sec.android.provider.badge.permission.WRITE" />
 <uses-permission android:name="com.htc.launcher.permission.READ_SETTINGS" />
 <uses-permission android:name="com.htc.launcher.permission.UPDATE_SHORTCUT" />
 <uses-permission android:name="com.anddoes.launcher.permission.UPDATE_COUNT" />
 <uses-permission android:name="com.majeur.launcher.permission.UPDATE_BADGE" />
 <uses-permission android:name="com.huawei.android.launcher.permission.READ_SETTINGS" />
 <uses-permission android:name="com.huawei.android.launcher.permission.CHANGE_BADGE" />
 <uses-permission android:name="com.huawei.android.launcher.permission.WRITE_SETTINGS" />
 <uses-permission android:name="com.sonyericsson.home.permission.RECEIVE_BADGE" />
 <uses-permission android:name="com.sonyericsson.home.permission.BROADCAST_BADGE" />
<!--请将yourpackage改为应用包名-->
<permission
    android:name="yourpackage.permission.MIPUSH_RECEIVE"
    android:protectionLevel="signature" />
<uses-permission android:name="yourpackage.permission.MIPUSH_RECEIVE" />

2 请您在应用的<application>段内添加以下内容:
<!-- 定义接收器,用来接收透传、api结果以及点击事件 -->
<!-- 请把此处设置为您定义的BroadcastReceiver派生类全名 -->
<receiver 
    android:name="yourpackage.PushReceiver">
    <intent-filter>
        <!-- 接收透传消息 -->
        <action android:name="com.ixintui.action.MESSAGE" />
        <!-- 接收register, add tag等反馈消息 -->
        <action android:name="com.ixintui.action.RESULT" />
        <!-- 接收notification click消息 -->
        <action android:name="com.ixintui.action.notification.CLICK" />
    </intent-filter>
</receiver>
        
<!-- 以下为push使用的活动,服务和接收器,请不要修改这些内容 -->
<activity
    android:name="com.ixintui.push.PushActivity"
    android:theme="@android:style/Theme.Translucent.NoTitleBar"
    android:configChanges="orientation|keyboardHidden" >
    <intent-filter>
        <action android:name="com.ixintui.push.PushActivity" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>
<!-- Rich push 核心功能 since 1.8-->
<activity
    android:name="com.ixintui.push.RichpushActivity"
    android:theme="@android:style/Theme.Translucent">
</activity>
<!-- push服务 -->
<service
    android:name="com.ixintui.push.PushService"
    android:exported="true"
    android:process=":ixintui_service_v1">
    <intent-filter>
        <action android:name="android.content.SyncAdapter" />
    </intent-filter>
    <meta-data
        android:name="android.content.SyncAdapter"
        android:resource="@xml/ixintui_sync" />
</service>
<service android:name="com.ixintui.push.DeamonService">
    <intent-filter>
        <action android:name="android.accounts.AccountAuthenticator" />
    </intent-filter>
    <meta-data
        android:name="android.accounts.AccountAuthenticator"
        android:resource="@xml/ixintui_deamon" />
</service>
<service
    android:name="com.ixintui.push.MediateService"
    android:exported="true" >
</service>
<!-- 推送内部使用的provider -->
<provider
    android:name="com.ixintui.push.Provider"
    android:exported="false"
    android:multiprocess="true"
    <!-- 请把yourpackage替换成您的应用包名 -->
    android:authorities="yourpackage.ixintui.push.provider"/>
<provider
    android:name="com.ixintui.push.SyncProvider"
    <!-- 请把yourpackage替换成您的应用包名 -->
    android:authorities="yourpackage.provider"
    android:exported="false"
    android:syncable="true" />
<receiver android:name="com.ixintui.push.Receiver">
    <intent-filter>
        <action android:name="com.ixintui.action.BROADCAST" />
    </intent-filter>
    <intent-filter>
        <action android:name="android.intent.action.PACKAGE_REMOVED"/>
        <data android:scheme="package" />
    </intent-filter>
    <intent-filter >
        <action android:name="android.intent.action.BOOT_COMPLETED" />
        <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
    </intent-filter>
</receiver>

<!--v1.8.7之后版本添加,小米推送所需配置,请务必添加-->
<receiver
    android:name="com.ixintui.push.MiPushReceiver"
    android:exported="true">
    <intent-filter>
        <action android:name="com.xiaomi.mipush.RECEIVE_MESSAGE" />
    </intent-filter>
    <intent-filter>
        <action android:name="com.xiaomi.mipush.MESSAGE_ARRIVED" />
    </intent-filter>
    <intent-filter>
        <action android:name="com.xiaomi.mipush.ERROR" />
    </intent-filter>
</receiver>

<service
    android:name="com.xiaomi.push.service.XMPushService"
    android:enabled="true"
    android:process=":pushservice" />
<service
    android:name="com.xiaomi.push.service.XMJobService"
    android:enabled="true"
    android:exported="false"
    android:permission="android.permission.BIND_JOB_SERVICE"
    android:process=":pushservice" />
<service
    android:name="com.xiaomi.mipush.sdk.PushMessageHandler"
    android:enabled="true"
    android:exported="true" />
<service
    android:name="com.xiaomi.mipush.sdk.MessageHandleService"
    android:enabled="true" />
<receiver
    android:name="com.xiaomi.push.service.receivers.NetworkStatusReceiver"
    android:exported="true">
    <intent-filter>
        <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />

        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</receiver>
<receiver
    android:name="com.xiaomi.push.service.receivers.PingReceiver"
    android:exported="false"
    android:process=":pushservice">
    <intent-filter>
        <action android:name="com.xiaomi.push.PING_TIMER" />
    </intent-filter>
</receiver>

<!--以下为华为推送配置,V1.9.2新增功能,如使用华为推送请务必添加,不使用请忽略-->
<receiver android:name="com.ixintui.push.HWPushReceiver">
    <intent-filter>
        <!-- 必须,用于接收token-->
        <action android:name="com.huawei.android.push.intent.REGISTRATION" />
        <!-- 必须,用于接收消息-->
        <action android:name="com.huawei.android.push.intent.RECEIVE" />
        <!-- 可选,用于点击通知栏或通知栏上的按钮后触发onEvent回调-->
        <action android:name="com.huawei.android.push.intent.CLICK" />
    </intent-filter>
    <meta-data
        android:name="CS_cloud_ablitity"
        android:value="successRateAnalytics" />
</receiver>

<!-- PushSDK:PushSDK接收外部请求事件入口 -->
<receiver
    android:name="com.huawei.android.pushagent.PushEventReceiver"
    android:process=":pushservice">
    <intent-filter>
        <action android:name="com.huawei.android.push.intent.REFRESH_PUSH_CHANNEL" />
        <action android:name="com.huawei.intent.action.PUSH" />
        <action android:name="com.huawei.intent.action.PUSH_ON" />
        <action android:name="com.huawei.android.push.PLUGIN" />
    </intent-filter>
    <intent-filter>
        <action android:name="android.intent.action.PACKAGE_ADDED" />
        <action android:name="android.intent.action.PACKAGE_REMOVED" />
		<!--请将yourpackage改为应用包名-->
        <data android:scheme="yourpackage" />
    </intent-filter>
</receiver>
<receiver
    android:name="com.huawei.android.pushagent.PushBootReceiver"
    android:process=":pushservice">
    <intent-filter>
        <action android:name="com.huawei.android.push.intent.REGISTER" />
        <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
    </intent-filter>
    <meta-data
        android:name="CS_cloud_version"
        android:value="\u0032\u0037\u0030\u0035" />
</receiver>
<!-- PushSDK:Push服务 -->
<service
    android:name="com.huawei.android.pushagent.PushService"
    android:process=":pushservice"></service>

<!-- 以下为魅族推送配置,v1.9.3新增功能,如使用魅族推送请务必添加,不使用请忽略 -->
<receiver android:name="com.ixintui.push.MZPushReceiver">
    <intent-filter>
        <!-- 接收push消息 -->
        <action android:name="com.meizu.flyme.push.intent.MESSAGE" />
        <!-- 接收register消息-->
        <action android:name="com.meizu.flyme.push.intent.REGISTER.FEEDBACK" />
        <action android:name="com.meizu.flyme.push.intent.UNREGISTER.FEEDBACK" />
        <action android:name="com.meizu.c2dm.intent.REGISTRATION" />
        <action android:name="com.meizu.c2dm.intent.RECEIVE" />
		<!--请将yourpackage改为应用包名-->
        <category android:name="yourpackage"></category>
    </intent-filter>
</receiver>
<!-- 必要配置,提高push消息送达率 -->
<service
    android:name="com.meizu.cloud.pushsdk.NotificationService"
    android:exported="true" />
<!-- 必要配置,pushSDK内部组件 -->
<receiver android:name="com.meizu.cloud.pushsdk.SystemReceiver">
    <intent-filter>
        <action android:name="com.meizu.cloud.pushservice.action.PUSH_SERVICE_START" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</receiver>  


BroadcastReceiver

开发者下发消息后,应用需要在本地实现一个BroadcastReceiver派生类进行接收,并在接收成功后根据特有的业务场景进行进一步处理。 
请确保在AndroidManifest.xml文件中已经注册过该receiver。


/*** 推送消息接收器 ***/
@Override
public void onReceive(Context context, Intent intent) 
{
    String action = intent.getAction();
	// 透传消息
	if (action.equals(SdkConstants.MESSAGE_ACTION)) 
    {
		String msg = intent.getStringExtra(SdkConstants.MESSAGE);
		String extra = intent.getStringExtra(SdkConstants.ADDITION);
		Log.d(TAG, "message received, msg is: " + msg + "extra: " + extra);
		// 处理透传内容
        // ...
	} 
    // SDK API的异步返回结果
	else if (action.equals(SdkConstants.RESULT_ACTION)) 
    {
         // API 名称
	     String cmd = intent.getStringExtra(SdkConstants.COMMAND);
         // 返回值,0为成功,否则失败
	     int code = intent.getIntExtra(SdkConstants.CODE, 0);
	     if (code != 0) 
         {
             // 错误信息
			 String error = intent.getStringExtra(SdkConstants.ERROR);
			 Log.d(TAG, "command is: " + cmd + " result error: " + error);
		} 
        else 
        {
			Log.d(TAG, "command is: " + cmd + "result OK");
		}
		// 附加结果,比如添加成功的tag, 比如推送是否暂停等
		String extra = intent.getStringExtra(SdkConstants.ADDITION);
		if (extra != null) 
        {
			Log.d(TAG, "result extra: " + extra);
		}		
	}
    // 通知点击事件
	else if (action.equals(SdkConstants.NOTIFICATION_CLICK_ACTION)) 
    {
		String msg = intent.getStringExtra(SdkConstants.MESSAGE);
		Log.d(TAG, "notification click received, msg is: " + msg);
	}            
}


接口的使用

1、推送初始化操作:
该接口是所有其他接口能正常使用的基础。在每次应用启动时,必须调用该接口才能保证推送的正常进行。

操作方法:

  • 请在应用的第一个Activity类(启动的第一个类)的oncreate中添加下面代码;
  • 或者在应用的application派生类的oncreate中添加下面一行代码:
//请一定确保四个参数都有值
//参数appKey为应用从ixintui申请的应用唯一标识符
//参数channel标识应用的分发渠道,用于统计推送信息,
//参数appVersion标识应用版本信息,用于统计推送信息
//参数miAppId小米appId
//参数miAppKey小米appKey
PushSdkApi.register(this, appKey, channel, appVersion);	

如果您希望在小米设备上使用小米推送,请使用以下注册接口:
PushSdkApi.register(this, appKey, channel, appVersion, miAppId, miAppKey);

请注意, 初始化(注册)是个异步过程,其结果会被Receiver接收。
在初始化(注册)成功后, 应用会获取到一个token来唯一标识本设备。获取方法如下:

String extra = intent.getStringExtra(SdkConstants.ADDITION);

这个函数无需重复多次调用,如果已经有了token就不需要再次调用了,否则会重复在Receiver中返回结果token。

2、增加标签接口

应用可以通过标签来标记特定的用户群体, 如“北京”用户,“男”用户, “商务”用户等。
Push系统根据伴随消息下发的标签来对特定人群进行消息发送。
在push系统中,标签是一个16位的整数,应用将标签值和具体含义相对应。
请注意,添加标签必须在成功初始化(注册)之后进行。 方法如下:

PushSdkApi.addTags(context, tags);
tags: List<Short>类型

其结果会异步返回到Receiver,通过如下方式获取。
结果格式为json的整数数组,表示添加成功的tag列表。
String extra = intent.getStringExtra(SdkConstants.ADDITION);
注意,由于系统限制一个用户最多设置16个tag,超出部分会被丢弃。返回结果中只有成功添加的tag。

3、删除标签接口
和增加标签接口类似,本接口必须在成功注册之后才能调用。
结果会异步返回到Receiver,只标识成功失败。失败唯一原因是数组中的tag都不存在。

PushSdkApi.deleteTags(context, tags);
参数:tags:List<Short>类型

4、列出标签接口
和添加标签接口类似,同样必须在成功注册之后才能调用

PushSdkApi.listTags(context);

异步结果会返回给Receiver,使用如下方式获取标签,其格式为json整数数组。

String extra = intent.getStringExtra(SdkConstants.ADDITION);

5、暂停push接口
暂停接收push消息。
必须在成功注册之后才能调用,调用方式如下。异步结果会返回给Receiver。

PushSdkApi.suspendPush(context);

6、恢复push接口
恢复本应用接收push,必须在成功注册之后才能调用,调用格式如下。
异步结果会返回给Receiver。

PushSdkApi.resumePush(context);

7、检查push是否暂停中
必须在成功注册之后才能调用。
异步结果会返回给Receiver, 通过如下方式获取。

PushSdkApi.isSuspended(context);
String extra = intent.getStringExtra(SdkConstants.ADDITION);
返回值:“true”标识已经暂停,”false”标识push正在运行

8、打开或关闭基本信息统计

PushSdkApi.enableStat(context, isEnable);
isEnable可以为true或false。
异步结果会返回给Receiver, 通过如下方式获取。
String extra = intent.getStringExtra(SdkConstants.ADDITION);
返回值:"true"标识已经开启统计,"false"标识基本信息统计关闭

9、绑定别名

PushSdkApi.bindAlias(context, alias);

alias为String,请注意限制长度为40个字节,这里长度并不是字符数,而是字符转成字节表示后的字节数,比如一个英文字母的UTF-8只占用一个字节,但是一个中文字符要占用二到三个字节。

异步结果会返回给Receiver, 通过如下方式获取。请注意多次重复调用可能只会一次返回结果,绑定成功的是最后调用的值

// 返回值,0为成功,否则失败

int code = intent.getIntExtra(SdkConstants.CODE, 0);

// 绑定成功的别名

String aliasBound = intent.getStringExtra(SdkConstants.ADDITION);

10、解绑别名

PushSdkApi.unbindAlias(context, alias);


alias为String,请注意限制长度为40个字节,这里长度并不是字符数,而是字符转成字节表示后的字节数,比如一个英文字母的UTF-8只占用一个字节,但是一个中文字符要占用二到三个字节。

异步结果会返回给Receiver, 通过如下方式获取。请注意多次重复调用可能只会一次返回结果,解绑成功的是最后调用的值
// 返回值,0为成功,否则失败

int code = intent.getIntExtra(SdkConstants.CODE, 0);
// 解绑成功的别名

String aliasUnbound = intent.getStringExtra(SdkConstants.ADDITION);

11、检查集成SDK结果

PushSdkApi.getSdkIntegrationInfo(context);
本接口应在注册之前调用,来检查SDK是否被正确完整的集成。同步结果将直接返回给调用者。

// 返回值

String result = PushSdkApi.getSdkIntegrationInfo(context);
// result字符串将集成结果展示出来,可以根据提示的信息做相应的检查和修改。

12、小红点功能相关接口

a.  onResume(Context context)方法,要求在应用的BaseActivity中重写onResume()调用此接口,传入context。
void onResume(Context context);
此方法初始化角标数据。

b.  onPause(Context context)方法,要求在应用的BaseActivity中重写onPause()调用此接口,传入context。
void onPause(Context context);
此方法更新角标数据。

c. 设置角标管理者:用于设置是否由App来管理角标的显示与清除。
void setBadgeModel(Context context, PushModel badgeModel);
badgeModel参数含义:
PUSH_MODEL(默认)表示Push服务管理角标:
1. 用户点击通知栏消息或者打开App会清除角标。
2. 要求开发者在应用的BaseActivity中重写onResume()调用onResume()接口,传入context。
3. setBadgeModel(context, true)时,不建议开发者调用管理角标接口。
APP_MODEL表示App管理角标:
1. 角标的显示可以由App自己管理,收到推送时触发。
2. 角标的清除也由App自己管理,用户行为不影响角标值。
3. 与Push服务管理的区别在于不做清除角标操作,由开发者在App内手动调用PushSDK相关接口设置与清除角标。

d. 设置角标:用于设置角标的显示值。
void setBadgeNum(Context context, int badgeNum);
badgeNum:显示的角标值。
badgeNum参数范围	含义
  >0	                设置App的角标为badgeNum
  =0	                清除当前应用的角标
  <0	                无效参数

e.  改变角标值:用于设置角标的增减。
void incrBadge(Context context, int incrNum);
incrNum:显示在现角标的基础上加incrNum后的值。
increaseNum参数范围	含义
  !=0	                在现有角标值上加increaseNum,显示计算后得到的badgeNum
  =0	                无效参数

f. 清除角标:清除指定App的角标。
void clearBadge(Context context);

g. 是否开启小米系统桌面角标管理:您可以自主选择由小米系统桌面或PushSDK管理角标。
void openMIBadge(Context context, boolean isOpen);
isOpen值	含义(前提为当前小米系统桌面)
  true	        PushSDK管理角标,可自定义角标显示值,但是通知栏会显示一条提醒通知。
  false	        MIUI Launcher管理角标,小米系统桌面自带角标显示功能,角标值不可
                自定义,每发送一条通知消息角标值+1。


13、注意事项:

1、由于Push SDK API均为异步过程(除检查集成SDK结果API), 请确保初始化(注册)成功返回异步结果后再进行其他操作;
2、重复调用同一API,可能只会异步返回一次结果;异步调用的结果请用如下方式检查:

// 返回值,0为成功,否则失败
int code = intent.getIntExtra(SdkConstants.CODE, 0);

3、SDK API调用时需要传入参数Context,不能为null;
4、测试过程中,请确认手机或者模拟器已成功连入网络。

混淆编译的配置

如果应用进行了混淆编译,需要在混淆的配置文件中加入以下代码,避免SDK被二次混淆编译,才能确保SDK功能正常使用。<br>
如果开发者使用了定制名的SDK,也需要对相应的包名加入类似代码。<br>

-keep class com.ixintui.** {*;} 
-keep public interface com.ixintui.** {*;}
-keep class com.xiaomi.** {*;} 
-keep class com.huawei.android.pushagent.** {*;}
-keep class com.meizu.cloud.pushsdk.** {*;}

注意:应用混淆编译的配置中避免使用-allowaccessmodification选项,防止SDK工作不正常。

打包时资源保持的配置

如果应用打包时选择去除资源,使用shrinkResources true进行了资源去除,需要在res/raw/目录加入一个keep.xml,避免SDK所需的layout被去除。其内容如下:
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools"
    tools:keep="@layout/ixintui_*"/>


使用unity集成SDK直接编译apk注意事项

以v1.7.0.9为例,需要注意的操作如下:
首先将ixintui_pushsdk_v1.7.0.9.jar包中的assets目录下面的所有文件手动拷贝到Assets/plugin/Android/assets目录下,
然后将ixintui_pushsdk_v1.7.0.9.jar拷贝到Assets/plugin/Android/libs目录下,
最后将layout文件拷贝到Assets/plugin/Android/res/layout目录下。


其他注意事项

我们推荐调用Register方法在MainActivity的onCreate中执行,防止其被多次调用。如果您在Application的派生类onCreate调用Register代码中需要注意防止多次初始化。 原因是由于Application的实例是每个进程一个的,service和receiver各自工作在一个进程中,service为一个独立进程,receiver在UI进程。UI进程在应用到后台时很容易被清理,一旦接收到广播,如果UI进程已经被杀死,会导致进程重新被创建,Application的onCreate被调用。另外service在收到命令时如果其独立进程被杀死也会重新启动,也会触发Application的onCreate被调用。如果需要在Application的onCreate作初始化动作,可设置一个持久化标志来表示初始化动作是否被做过,或者还可以判断进程名字来区分是UI进程还是service独立进程做不同的初始化控制。