Service使用 一直运行的后台服务

项目中需要实现消息推送:不依赖程序是否开启,自动隔一段时间去服务器获取相关消息,原理类似邮件系统。
开始想到用闹钟--AlarmManager,以前做开奖提醒用过。
后来尝试用Service。
涉及到几点:
1、退出程序,service依然运行
2、开机,启动service
3、不重复启动service

注意:service在程序退出后,会自动调用onCreate方法,而不是onStart,跟网上说的有出于:onCreate只调用一次,onStart多次调用。很奇怪,期待高人解答

public class PushService extends Service {
private final long defaultPeriodTime = 60 * 60 * 1000;//默认1个小时
private final long defaultdelayTime = 0;//默认延时多久
private final String delayTimeFlag = "delayTimeFlag";
private final String periodTimeFlag = "periodTimeFlag";
private final String TAG = "PushService";
private final String ServiceConfig = "acp_pushMsgSet";
private final int NOTICE_ID = 1223;
private SharedPreferences serviceSettings;//存储本地数据的文件
private long delayTime = 0;
private long periodTime = defaultPeriodTime;//delayTime + periodTime = 访问服务端的时间间隔
private PushMsgBean pushMsgBean;
private Context context;


@Override
public void onCreate() {
context = this;
DebugLog.logOnFile("%s", TAG + "--" + "onCreate");
SpanTimeThread time = new SpanTimeThread();
time.start();
}


@Override
public IBinder onBind(Intent intent) {
return null;
}


@Override
public void onDestroy() {
}


@Override
public void onStart(Intent intent, int startid) {
DebugLog.logOnFile("%s", TAG + "--" + "onStart");
String comeFromFlag = intent.getStringExtra("BOOTStartSerVice");
//第一次启动,访问服务端,开机重启Service则不访问服务端
if(!(comeFromFlag != null && comeFromFlag.equalsIgnoreCase("BootFlag"))){
DebugLog.logOnFile("%s", TAG + "---first Start-------");
startNetOfPushMsgData();
}else{
DebugLog.logOnFile("%s", TAG + "---boot Start-------");
}
}


/**
* 定时计算是否去获取资讯内容
*
* @project TestService
* @author hshm
* @date 2011-9-16
* Copyright (C) 2010-2012 www.2caipiao.com Inc. All rights reserved.
*/
class SpanTimeThread extends Thread {


public void run() {


while (Config.releaseFlag) {
try {

getLocalConfig();

DebugLog.logOnFile("%s", TAG + "---" + (delayTime + periodTime));
//本地认证,服务端返回的时间小于一个小时,则采用默认值
if(periodTime < defaultPeriodTime){
periodTime = defaultPeriodTime;
}
DebugLog.logOnFile("%s", TAG + "-start--" + new Date().getTime() + "---" + (delayTime + periodTime));

sleep((delayTime + periodTime));
DebugLog.logOnFile("%s", TAG + "-end--" + new Date().getTime());
startNetOfPushMsgData();


} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}


/**
* 获取本地配置:上次访问服务端时间,访问服务端时间间隔,计算时间的间隔
*/
private void getLocalConfig() {
serviceSettings = getSharedPreferences(ServiceConfig, 0);


if(serviceSettings != null){
delayTime = serviceSettings.getLong(delayTimeFlag, defaultdelayTime);
periodTime = serviceSettings.getLong(periodTimeFlag, defaultPeriodTime);
DebugLog.logOnFile("%s", TAG + "--getLocalConfig--" + delayTime + "---" + periodTime);
}
}


/**
* 记录时间
* @param iKey
* @param iValue String
*/
private void saveDateTime(String iKey, String iValue) {

}

/**
* 获取标识码,手机|平板
* @return
* @create_time 2011-4-21 下午02:15:42
*/
private String getWeiYiBiaoShi() {
String WeiYiBiaoShi = "3G";


return WeiYiBiaoShi;
}


/**
* 获取推送的消息
*
* @create_time 2011-9-16 下午4:25:26
*/
private void startNetOfPushMsgData() {

}


private Handler pushMsgHandler = new Handler() {
public void handleMessage(Message msg) {
switch (msg.what) {
case Config.pushMsg_OK:

break;
}
}
};


/**
* 通知栏显示消息
*
* @create_time 2011-9-16 下午4:42:23
*/
public void notifyMsgToUser() {
//获得通知管理器,通知是一项系统服务
NotificationManager manager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
//初始化通知对象 p1:通知的图标 p2:通知的状态栏显示的提示 p3:通知显示的时间
Notification notification = new Notification(R.drawable.msgalarm, pushMsgBean.getTitle(), System.currentTimeMillis());


//点击通知后的Intent,此例子点击后还是在当前界面
Intent descIntent = new Intent(context, com.acp.main.DesktopUI.class);
descIntent.putExtra(DesktopUI.requestCode, String.valueOf(DesktopUI.ZX));
descIntent.putExtra(DesktopUI.requestCode_push, NewsListUI.TZXX);
PendingIntent intent = PendingIntent.getActivity(context, 0, descIntent, 0);


//设置通知信息
notification.setLatestEventInfo(context, pushMsgBean.getTitle(), pushMsgBean.getCon(), intent);
notification.flags |= Notification.FLAG_AUTO_CANCEL;
notification.defaults |= Notification.DEFAULT_SOUND;


manager.notify(NOTICE_ID, notification);
}


//监听开机消息,启动服务
public class BootReceiver extends BroadcastReceiver {
private final String BOOTFlag = "BootFlag";//在service的onStart方法中区别,是否为开机事件启动service的。

@Override
public void onReceive(Context context, Intent intent) {

//启动PUSH消息服务
context.startService(new Intent(context, PushService.class).putExtra("BOOTStartSerVice", BOOTFlag));

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值