zoukankan      html  css  js  c++  java
  • 采用Service实现本地推送通知

    在android的应用层中,涉及到很多应用框架,例如:Service框架,Activity管理机制,Broadcast机制,对话框框架,标题栏框架,状态栏框架,通知机制,ActionBar框架等等。

    经常会使用到通知机制中的通知栏框架(Notificaiton),它适用于交互事件的通知。它是位于顶层可以展开的通知列表。它会时不时的提醒你什么软件该更新了,什么人发你微信消息了等。

    我主要用于记录于,按时来领取体力啊,来登录领奖啊,这个在游戏中用途比较广泛

    1.写一个类NotificationService继承Service

    功能逻辑:启动一个线程,定时检查是否要发送领取奖励,体力了,我这边由于涉及到公司东西,写的是简单的demo,只判断了时间点,就发送通知,实际游戏中可能根据是否已经领取过,多少等级,启动多久之后等条件,有问题可以共同讨论。

    代码:

    package com.test.service;
    
    import java.util.Calendar;
    import java.util.List;
    
    import android.R;
    import android.app.ActivityManager;
    import android.app.Notification;
    import android.app.NotificationManager;
    import android.app.PendingIntent;
    import android.app.Service;
    import android.content.ComponentName;
    import android.content.Context;
    import android.content.Intent;
    import android.os.IBinder;
    import android.util.Log;
    
    public class NotificationService extends Service {
    
        private static final String TAG = "TAG";
        private static final int    CHECK_TICK = 1*60*1000;
        private static final int    GET_STAMINA_ID = 1;
        private static final int    PUNCH_CARD_ID = 2;
        
        private NotificationService m_service = null;
        private NotificationManager m_notificationMgr = null;
        private NotifyThread m_notifyThread = null;
        
        @Override
        public IBinder onBind(Intent intent) {
            // TODO Auto-generated method stub
            return null;
        }
    
        @Override
        public void onCreate() {
            // TODO Auto-generated method stub
            super.onCreate();
            
            m_service = this;
            m_notificationMgr = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);
            
            if(m_notificationMgr == null)
            {
                Log.i(TAG, "NotificationService noticationMgr null");
            }
            m_notifyThread = new NotifyThread();
            m_notifyThread.start();
            
            Log.i(TAG, "NotificationService onCreate...");
        }
    
        @Override
        public int onStartCommand(Intent intent, int flags, int startId) {
            // TODO Auto-generated method stub
            
            Log.i(TAG, "NotificationService onStartCommand...");
            
            return super.onStartCommand(intent, flags, startId);
        }
    
        @Override
        public void onDestroy() {
            // TODO Auto-generated method stub
            
            Log.i(TAG, "NotificationService onDestroy...");
            
            if(m_notifyThread != null)
            {
                m_notifyThread.stopThread();
            }
            
            super.onDestroy();
        }
    
        public void notify(int notifyId, String strTitle, String strMsg)
        {    
            if(m_notificationMgr != null)
            {
                Notification localNotification = new Notification();
                localNotification.icon = R.id.icon;
                localNotification.defaults = Notification.DEFAULT_VIBRATE|Notification.DEFAULT_SOUND;
                localNotification.when = System.currentTimeMillis();
                localNotification.tickerText = strMsg;
            
                ComponentName componentName = new ComponentName(this, LoadingActivity.class);
                Intent intent = new Intent(Intent.ACTION_MAIN);
                intent.addCategory(Intent.CATEGORY_LAUNCHER);
                intent.setComponent(componentName);
                //Intent intent = new Intent(this, LoadingActivity.class);
                //intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, 0);
                localNotification.setLatestEventInfo(this, strTitle, strMsg, pendingIntent);
                
                m_notificationMgr.notify(notifyId, localNotification);
            }
        }
        
        public static boolean isRunning(Context context) 
        {
            ActivityManager activityMgr = (ActivityManager)context.getSystemService(Context.ACTIVITY_SERVICE);
            if(activityMgr != null)
            {
                List<ActivityManager.RunningServiceInfo> serviceList = activityMgr.getRunningServices(50);
                
                if(serviceList.isEmpty())
                {
                    return false;
                }
    
                for (int i = 0, n = serviceList.size(); i < n; ++i) 
                {
                    if(serviceList.get(i).service.getClassName().toString().equals("com.jthd.marsX.NotificationService"))
                    {
                        return true;
                    }
                }
            }
            
            return false;
        }
        
        private class NotifyThread extends Thread
        {
            private boolean m_bStop = false;
            
            public synchronized void stopThread()
            {
                m_bStop = true;
            }
            
            @Override
            public void run() 
            {
                Log.i(TAG, "NotifyThread run...");
                
                while(!m_bStop)
                {
                    checkNotify();
                    
                    try
                    {
                        sleep(CHECK_TICK);
                    }
                    catch (InterruptedException e) 
                    {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
                
                Log.i(TAG, "NotifyThread stop...");
            }
            
            public void checkNotify()
            {
                Calendar cal = Calendar.getInstance();
                int hour = cal.get(Calendar.HOUR_OF_DAY);
                //int minute = cal.get(Calendar.MINUTE);
                //int second = cal.get(Calendar.SECOND);
                
                //Log.i(TAG, "hour:" + hour + "m:" + minute + "s:" + second);
                
                if((hour >= 12 && hour < 14) || (hour >= 18 && hour <20))
                    m_service.notify(GET_STAMINA_ID, "通知", "来这领取你的体力了");
                
                if(hour == 20)
                    m_service.notify(PUNCH_CARD_ID, "通知", "来这签到领奖了");
            }
        }
    }

    2.写个启动服务的代码

    package com.test.service;
    
    import android.content.Intent;
    import android.os.Bundle;
    import android.util.Log;
    
    import org.cocos2dx.lib.Cocos2dxActivity;
    
    public class GameActivity extends Cocos2dxActivity {
    
        protected void onCreate(Bundle savedInstanceState) {
    
            super.onCreate(savedInstanceState);
    
            startService();
        }
    
        @Override
        protected void onResume() {
            // TODO Auto-generated method stub
            super.onResume();
        }
    
        @Override
        protected void onPause() {
            // TODO Auto-generated method stub
            super.onPause();
        }
    
        @Override
        protected void onDestroy() {
            // TODO Auto-generated method stub
            super.onDestroy();
        }
        
        public void startService()
        {
            if(!NotificationService.isRunning(this))
            {
                Intent startIntent = new Intent(this, 
            NotificationService.class);
                startService(startIntent);
            }
        }
    }

    需要在AndroidManifest.xml注册这两个类,一个Activity,一个Service

    最近玩的像素鸟游戏 http://aaron.apps.cn/details?app=d00d1a119cb07178245ec5ae728e34a0

  • 相关阅读:
    bzoj2733 永无乡 平衡树按秩合并
    bzoj2752 高速公路 线段树
    bzoj1052 覆盖问题 二分答案 dfs
    bzoj1584 打扫卫生 dp
    bzoj1854 游戏 二分图
    bzoj3316 JC loves Mkk 二分答案 单调队列
    bzoj3643 Phi的反函数 数学 搜索
    有一种恐怖,叫大爆搜
    BZOJ3566 概率充电器 概率dp
    一些奇奇怪怪的过题思路
  • 原文地址:https://www.cnblogs.com/sharestudy/p/5652461.html
Copyright © 2011-2022 走看看