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

}

}

你可能感兴趣的:(Date,String,manager,service,null,Class)