採用Service實現本地推送通知

来源:http://www.cnblogs.com/sharestudy/archive/2016/07/08/5652461.html
-Advertisement-
Play Games

在android的應用層中,涉及到很多應用框架,例如:Service框架,Activity管理機制,Broadcast機制,對話框框架,標題欄框架,狀態欄框架,通知機制,ActionBar框架等等。 經常會使用到通知機制中的通知欄框架(Notificaiton),它適用於交互事件的通知。它是位於頂層 ...


在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


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 最近做一個長按文本複製全部內容的功能,在網上找了一個方法,使用起來很簡單,但是自己在使用的過程中出現了問題. 我的項目中文本控制項不是用的UILabel而是網上找的一個第三方框架OHAttributedLabel,其他的什麼就不多說了,主要寫寫我在其中遇見的問題吧.事先我給label設置了一個長按手勢 ...
  • // NSParagraphStyleAttributeName 段落的風格(設置首行,行間距,對齊方式什麼的)看自己需要什麼屬性,寫什麼 NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init] ...
  • 這個demo寫的是將集合視圖添加到滾動視圖中,實現可以滑動的效果。 (效果圖) 1.創建視圖,定義集合視圖和滾動視圖 2.初始化我們定義的集合視圖和滾動視圖 3.實現集合視圖的代理方法 4.結束! 此文是小編第一次書寫博客,有不足的地方還請大神指點改正。 ...
  • ...
  • ...
  • 最近想把之前自己做的一些好玩的項目共用到Github,網上找了一圈上傳教程,都感覺寫的太深奧、複雜,雲里霧裡,特把自己的方法紀錄如下: PS:這種方式一般適用於:開始做項目時,沒有直接在github上添加,等做到一半或做完才想添加的項目。 準備工作: 1、Github帳號 2、在Github上添加新 ...
  • 前言:昨天公司計劃把項目中的部分功能做出SDK的形式,供其他公司的產品使用,所以不得不重新研究一下單例模式。 為什麼單例 1、在記憶體中只有一個對象,節省記憶體空間。避免頻繁的創建銷毀對象,可以提高性能。避免對共用資源的多重占用。可以全局訪問。 2、確保一個類只有一個實例,自行實例化並向系統提供這個實例 ...
  • ■ 基本操作 啟動: oncreate onstart onresume back: onPause onStop onDestroy home: onPause onStop home後的啟動(未銷毀): onRestart onStart onResume 已銷毀後的啟動:onCreate on ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...