1. 程式人生 > >極光訊息推送及角標實現,附帶完整demo

極光訊息推送及角標實現,附帶完整demo

摘要:本次實現了使用者登入註冊,將使用者儲存到Application 裡面實現使用者持久化,使用者有已讀訊息檢視,未讀訊息檢視,傳送訊息功能,未讀訊息讀取後,新增到已讀訊息裡面,傳送訊息具有推送功能 可以全部發送,和選擇人員傳送,傳送訊息過後,如果當前使用者線上會收到一條工作列通知,點選通知可以檢視到該訊息,登入App時,APP應用會生成,未讀資訊角標,(實現了vivo和小米。

流程圖:

 

專案結構

 

 

專案使用jar:

 

專案使用許可權:

 

廣播接收器:

<!-- Required SDK 核心功能 -->
<!-- 可配置android:process引數將PushService放在其他程序中 -->
<service
    
android:name="cn.jpush.android.service.PushService"     android:enabled="true"     android:exported="false">     <intent-filter>         <action android:name="cn.jpush.android.intent.REGISTER" />         <action android:name="cn.jpush.android.intent.REPORT" />         <action android
:name="cn.jpush.android.intent.PushService" />         <action android:name="cn.jpush.android.intent.PUSH_TIME" />     </intent-filter> </service> <!-- since 1.8.0 option 可選項。用於同一裝置中不同應用的JPush服務相互拉起的功能。 --> <!-- 若不啟用該功能可刪除該元件,將不拉起其他應用也不能被其他應用拉起 --> <service     android
:name="cn.jpush.android.service.DaemonService"     android:enabled="true"     android:exported="true">     <intent-filter>         <action android:name="cn.jpush.android.intent.DaemonService" />         <category android:name="com.example.pk.tuisong" />     </intent-filter> </service> <!-- Required SDK核心功能 --> <receiver     android:name="cn.jpush.android.service.PushReceiver"     android:enabled="true">     <intent-filter android:priority="1000">         <action android:name="cn.jpush.android.intent.NOTIFICATION_RECEIVED_PROXY" />         <category android:name="com.example.pk.tuisong" />     </intent-filter>     <intent-filter>         <action android:name="android.intent.action.USER_PRESENT" />         <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />     </intent-filter>     <!-- Optional -->     <intent-filter>         <action android:name="android.intent.action.PACKAGE_ADDED" />         <action android:name="android.intent.action.PACKAGE_REMOVED" />         <data android:scheme="package" />     </intent-filter> </receiver> <!-- Required SDK核心功能 --> <activity     android:name="cn.jpush.android.ui.PushActivity"     android:configChanges="orientation|keyboardHidden"     android:exported="false"     android:theme="@android:style/Theme.NoTitleBar">     <intent-filter>         <action android:name="cn.jpush.android.ui.PushActivity" />         <category android:name="android.intent.category.DEFAULT" />         <category android:name="com.example.pk.tuisong" />     </intent-filter> </activity> <!-- SDK核心功能 --> <activity     android:name="cn.jpush.android.ui.PopWinActivity"     android:configChanges="orientation|keyboardHidden"     android:exported="false"     android:theme="@style/MyDialogStyle">     <intent-filter>         <category android:name="android.intent.category.DEFAULT" />         <category android:name="com.example.pk.tuisong" />     </intent-filter> </activity> <!-- Required SDK核心功能 --> <service     android:name="cn.jpush.android.service.DownloadService"     android:enabled="true"     android:exported="false" /> <!-- Required SDK核心功能 --> <receiver android:name="cn.jpush.android.service.AlarmReceiver" />

資料表結構:

User表:

欄位

型別

作用

備註

ID

Int

主鍵,自增長

確定每條資料的唯一性

Username

String

使用者名稱,唯一

極光推送的別名

Password

String

密碼

Xiaoxi表:

欄位

型別

作用

備註

ID

Int

主鍵

確定每條資料的唯一性

Username

String

使用者名稱

確定是哪個使用者的訊息

Xiaoxi

String

訊息,內容

該條訊息的內容

Biaoti

String

訊息的標題

本條訊息的標題

第一步:

實現登入註冊,把賬號資訊傳送給伺服器,繫結使用者,以便後面訊息傳送操作!

(此功能上次已做!)

第二步:

訊息的傳送:

進入該activity時 通過伺服器查詢出該使用者的 已讀訊息 和未讀訊息,

點選已讀訊息時 會跳轉到一個listview 裡面顯示了該使用者的已讀訊息,

點選未讀訊息的時候 會跳轉到一個listview 裡面顯示了該使用者的未讀訊息,改listview 擁有一個點選事件,當點選某條訊息時,會跳轉到一個顯示頁面,顯示該條資訊,並把該訊息的狀態改為已讀。

Listview的點選事件:


ListView  list = (ListView) findViewById(R.id.listwd);
list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
                            long arg3) {
        text=(TextView)arg1.findViewById(R.id.friend_username);

        String name1 = text.getText().toString();
        int aid =text.getId();

        Toast.makeText(Unread.this,"ID" + arg2 + "個專案",Toast.LENGTH_SHORT).show();
        xiaoxics.setUsername(name);
        xiaoxics.setBiaoti(name1);
        xiaoxics.setXiaoxizt(arg2+"");

        String xiaoxijson = JSON.toJSONString(xiaoxics);

        Intent intent = new Intent(Unread.this,XianshiXinXi.class);
        intent.putExtra("shuju",xiaoxijson);
        startActivity(intent);
    }
});

此處實現了listview裡面 擁有一個簡單的Textview的點選事件,請勿假如Button,加入Button 此點選事件將無效!

點擊發送訊息時,會跳到一個全新的activity

在這裡 輸入訊息的標題和內容 點擊發送所有人時 會把次訊息傳送給伺服器 伺服器儲存該訊息,並像使用者推送

      public staticString push(List<String> username,Stringbiaoti,String username1){

            User user = new User();

            user.setUsername(username1);

            user.setPassword(biaoti);   

            String userjson = JSON.toJSONString(user);

            String fhz = "loser";

            String masterSecret ="cb79148f2b69efa00dbc16b0";

            String appKey = "76a005b037fa2b8194fe412a";

            JPushClient jpushClient =new JPushClient(masterSecret,appKey);   

            PushPayload payload =PushPayload.newBuilder()

                        .setMessage(Message.content(userjson))

                        .setPlatform(Platform.android_ios())

                        .setAudience(Audience.alias(username))

                        .setNotification(Notification.newBuilder()

                               .addPlatformNotification(AndroidNotification.newBuilder()

                                        .addExtra("type","傳回去的資料)

                                        .setAlert("你有一條新訊息")

                                        .build())

                               .addPlatformNotification(IosNotification.newBuilder()

                                        .addExtra("type","傳回去的資料")

                                        .setAlert("你有一條新訊息")

                                        .build())

                                .build())

                        .setOptions(Options.newBuilder()

                                .setApnsProduction(false)

                                .setTimeToLive(90)/

                                .build())

                        .build();         

點擊發送物件時 會把該頁面的主題 和內容傳到一個新的頁面,該頁面有一個listview ,該listview 顯示了所有的使用者名稱,具有一個多選事件,當選擇完使用者後,會把主題和內容和使用者集合傳送給伺服器,伺服器會根據使用者名稱推送訊息。

public class SendOut extends BaseActivity {
    ListView list;
    List<User> userList,usernamelist = null;
    Fsong fsong = null;
    MyHandiler2 myHandiler2;
    ArrayList<HashMap<String, Object>> listData;
    //介面卡
    CheckboxAdapter listItemAdapter;
    String name1=null;
    TextView buttonfsdxfhsy;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_send_out);


        buttonfsdxfhsy = (TextView) findViewById(R.id.buttonfsdxfhsy);



        myHandiler2 = new MyHandiler2();

        Intent intent = getIntent();
        String fsongjson = intent.getStringExtra("fsong");
        fsong = JSON.parseObject(fsongjson, Fsong.class);

//反回主頁
        buttonfsdxfhsy.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent23 = new Intent(SendOut.this,Home_page.class);
                intent23.putExtra("dxfsfh",fsong.getUsername());
                startActivity(intent23);
            }
        });


        Button getValue = (Button) findViewById(R.id.get_value);
        getValue.setOnClickListener(listener);
//listview
        list = (ListView) findViewById(R.id.list);
//儲存資料的陣列列表
        listData = new ArrayList<HashMap<String, Object>>();

        //顯示所有已讀訊息
        final okHttp ok = new okHttp();
        try {
            new Thread(new Runnable() {
                @Override
                public void run() {
                    Message msg = new Message();
                    try {
                        userList = ok.duxianzs();
                        msg.what = 1;
                        String listjson = JSON.toJSONString(userList);
                        Bundle bundle = new Bundle();
                        bundle.putSerializable("list", listjson);
                        msg.setData(bundle);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                    myHandiler2.sendMessage(msg);
                }
            }).start();
        } catch (Exception e) {
            e.printStackTrace();
        }

    }


    //事件響應
    View.OnClickListener listener = new View.OnClickListener() {

        @Override
        public void onClick(View v) {
// TODO Auto-generated method stub
            HashMap<Integer, Boolean> state = listItemAdapter.state;
            List<User> stringlist =new  ArrayList<User>();
            String options = "選擇的項是:";
            for (int j = 0; j < listItemAdapter.getCount(); j++) {
                System.out.println("state.get(" + j + ")==" + state.get(j));
                if (state.get(j) != null) {
                    User user = new User();
                    @SuppressWarnings("unchecked")
                    HashMap<String, Object> map = (HashMap<String, Object>) listItemAdapter.getItem(j);
                    String username = map.get("friend_username").toString();
                    user.setUsername(username);
                    Log.i("info", "__________________________9527___________________" +username);
                    options+="\n"+"."+username;
                    Log.i("info", "__________________________9527___________________" +options);
                    stringlist.add(user);
                }
            }
            fsong.setUserList(stringlist);
            Log.i("info", "__________________________9527___________________" +fsong.getXiaoxi());


            final okHttp ok = new okHttp();
            try {
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        Message msg = new Message();
                        try {
                            String xiaoxi = ok.dxtssj(fsong);
                            msg.what = 2;
                            Bundle bundle = new Bundle();
                            bundle.putSerializable("xiaoxixi", xiaoxi);
                            Log.i("info", "____________9527______________9527___________________" +xiaoxi);
                            msg.setData(bundle);
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                        myHandiler2.sendMessage(msg);
                    }
                }).start();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    };

    //資料的傳遞
    public class MyHandiler2 extends Handler {
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            switch (msg.what) {
                case 1:
                    String list12 = (String) msg.getData().getSerializable("list");
                   List<User> userlistqw =JSON.parseArray(list12, User.class);

                    Log.i("info","____________________________________________________________"+userList.size());
                    for(int i=0;i<userList.size();i++){
                        HashMap<String, Object> map=new HashMap<String, Object>();
                        map.put("friend_username",userList.get(i).getUsername());
                        map.put("selected", false);
                        //新增資料
                        listData.add(map);
                    }
                    //介面卡
                    listItemAdapter = new CheckboxAdapter(SendOut.this, listData);
                    list.setAdapter(listItemAdapter);
                    break;
                case 2:
                    String xiaoxixi = (String) msg.getData().getSerializable("xiaoxixi");
                    Log.i("info","_______________________888____888____888_____________________________"+xiaoxixi);
                    String name =xiaoxixi.substring(0,1);
                    if (name.equals("1")) {
                        Toast.makeText(getApplicationContext(), "傳送成功!", Toast.LENGTH_LONG).show();
                    } else {
                        //顯示選擇內容
                        Toast.makeText(getApplicationContext(), "傳送失敗!", Toast.LENGTH_LONG).show();
                    }
                    break;
            }
        }
    }

第三步:

對接收推送回來的資料進行操作:

推送回來的訊息會被BroadcastReceiver廣播接收,在此廣播中隊接到的資料進行操作!

public class MyReceiver extends BroadcastReceiver{
    String username = null;
    @Override
    public void onReceive(Context context, Intent intent) {

//判斷是否接收到了資料,並工作列顯示:
        if (intent.getAction().equals(JPushInterface.ACTION_MESSAGE_RECEIVED)) {
            Bundle bundle = intent.getExtras();
            String title = bundle.getString(JPushInterface.EXTRA_TITLE);
            String  message = bundle.getString(JPushInterface.EXTRA_MESSAGE);
            username = message;
            String shuju =bundle.getString("type");
            Toast.makeText(context, message, Toast.LENGTH_LONG).show();
            Log.i("info","___message_____123_______________________"+bundle.toString());

        }
//判斷工作列的推送是否被點選 點選了後的操作!
        if (JPushInterface.ACTION_NOTIFICATION_OPENED.equals(intent.getAction())) {
            
            Bundle bundle = intent.getExtras();
            int name1=bundle.getInt(JPushInterface.EXTRA_NOTIFICATION_ID);
            String title = bundle.getString(JPushInterface.EXTRA_TITLE);
            String name =bundle.getString(JPushInterface.EXTRA_EXTRA);
            String  message = bundle.getString(JPushInterface.EXTRA_MESSAGE);
            Log.i("info", "使用者點選打開了通知--------120----->"+name.toString());Mapp map =JSON.parseObject(name,Mapp.class);Log.i("info", "使用者點選打開了通知--------120----->"+map.toString());
            String usernam = map.getType();
         Log.i("info", "使用者點選打開了通知--------120----->"+usernam);

//點選過後 把推送回來的資料 轉發到訊息顯示頁面,讓該頁面顯示此訊息!
            Intent intent1 = new Intent();
            intent1.putExtra("cgb",usernam);
            intent1.setClass(context,Tuisongxianshi.class);
            intent1.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            context.startActivity(intent1);
        }
    }

最後角標的實現:

下面就是手機角標的實現,只需要得到未讀訊息的條數,然後傳入這兩個方法就行

//獲取手機品牌
String phoneName = android.os.Build.MODEL;
//vivo 角標設定
if(phoneName.equals("vivo Y51")){
    Intent intent2 = new Intent("launcher.action.CHANGE_APPLICATION_NOTIFICATION_NUM");
    intent2.putExtra("packageName",packageName);
    String launchClassName =lancherActivityClassName;
    intent2.putExtra("className", launchClassName);
    //顯示的角標數!
    intent2.putExtra("notificationNum",a);
    sendBroadcast(intent2)
            
           

相關推薦

極光訊息實現附帶完整demo

摘要:本次實現了使用者登入註冊,將使用者儲存到Application 裡面實現使用者持久化,使用者有已讀訊息檢視,未讀訊息檢視,傳送訊息功能,未讀訊息讀取後,新增到已讀訊息裡面,傳送訊息具有推送功能 可以全部發送,和選擇人員傳送,傳送訊息過後,如果當前使用者線上會收到一條工

極光訊息伺服器端開發實現(上)

以前一直使用的極光的手動輸入推送內容然後推送到客戶端,今天遇到了推送頻率比較高且比較有規律的內容,比如事實天氣。這樣就需要用我們自己的伺服器來自動生成推送內容了。 可以看到,上面兩句話很醒目,我們看看它封裝的REST API是個什麼東西,再點進去看看 上面兩句話讀了一

極光訊息伺服器端開發實現(下)

前面我們已經實現了通過我們自己的伺服器生成訊息向極光訊息推送伺服器傳送推送訊息的功能,下面我們來看看如何在手機客戶端實現訊息接收。 一、在極光上建立一個測試專案 如上圖所示,下載Android Example 執行效果如圖 下面我們通過原始碼先看看上面的四行顯示Tex

iOS極光清除解決方案

問題描述: 最近在專案中集成了極光推送,接收通知後,發現手機上的app圖示右上角一直有個紅色的數字1無法清除,但是在程式碼中已經設定了使角標清除的方法。 通過測試發現,如果收到通知後點擊通知欄進入app,則角標會清除; 如果收到通知後直接點選app圖示或者設定方法使得接收通知後直

SignalR+HTML5實現訊息Android通知欄訊息

最近在研究使用SignalR實現跨平臺的訊息中心,WebAPI+SignalR作為資料介面和訊息中心,客戶端包含WPF桌面應用、Web應用和Android移動應用。這其中關鍵的功能點在於接收到實時訊息後的通知提醒,桌面應用和Web應用實現相對簡單,Android

Android接入極光訊息

極光訊息推送: 極光推送(JPush)是一個端到端的推送服務,使得伺服器端訊息能夠及時地推送到終端使用者手機上,讓開發者積極地保持與使用者的連線 主要功能 保持與伺服器的長連線,以便訊息能夠即時推送到達客戶端 接收通知與自定義訊息,並向開發者App 傳遞

訊息的幾種實現方式

B/S架構的系統多使用HTTP協議,所以首先來看看HTTP協議: HTTP協議的特點: 列表內容 無狀態性; 通過Internet傳送請求訊息和響應訊息; 使用埠接收和傳送訊息,預設為80埠;但是底層還是使用Socket完成。

React Native整合極光訊息

在蘋果開發者賬戶中配置好自己的APP的應用ID,然後使用上述一鍵生成證書功能生成自己的開發證書(不要忘了勾上推送通知)! 在IOS推送設定中上傳自己的證書(密碼一鍵生成後會給出) 3.xcode修改 三、專案構建: 1

學習使用Android極光訊息

下載SDK 配置 依照如下形式在清單檔案中新增程式碼,並把包名和Appkey換成自己的包名。 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http

php 接極光 普通訊息和標題內容訊息實現方法

一、如下兩種訊息樣式推送方法,這裡介紹第一種標題+內容樣式的訊息推送。 1.首先,下載極光PHP的SDK,引入到專案,基礎參考 https://docs.jiguang.cn/jpush/server/sdk/php_sdk/   這裡不詳細介紹了 2.在

ios程式後臺執行時當有訊息過來如何修改程式上是數字

這個得在發訊息的伺服器中給你累加,客戶端只是被動的顯示applicationIconBadgeNumber值。當客戶端收到推送訊息時要告訴伺服器端,伺服器將applicationIconBadgeNumber置為0,當在後臺或未開啟時,不能告訴伺服器端,伺服器每發一條,就會

一種通過xmpp實現離線訊息的方法系統

[0039] 此外,本發明單獨設定的功能模組-1OS訊息模組,本質上既是XMPP伺服器的客戶端,又是APNS伺服器的訊息源,當訊息處理的瓶頸位於1S訊息模組時,如當前的1S訊息模組效能待改善或者同一時間內眾多離線訊息到達1S訊息模組時,則只需增加1S訊息模組伺服器的數量即可以解決此訊息處理瓶頸,因此本發明極易

極光的代碼實現

分享 orm result bsp library not etop tags alias 一:去官網下載SDK或者直接在maven項目中進行相應配置 <dependencies> <dependency> <grou

極光_總結_01_Java實現極光

-type blank 經驗 內容 .cn util post org header 一、代碼實現 1.配置類—Env.java package com.ray.jpush.config; /**@desc : 極光推送接入配置 *

android 實現mqtt訊息以及不停斷線重連的問題解決

前段時間專案用到mqtt的訊息推送,整理一下程式碼,程式碼的原型是網上找的,具體哪個地址已經忘記了。 程式碼的實現是新建了一個MyMqttService,全部功能都在裡面實現,包括連伺服器,斷線重連,訂閱訊息,處理訊息,釋出訊息等基本操作。 首先新增依賴: dependencies { &

基於Netty實現的Android 訊息(即時通訊)的解決方案

根據Netty框架實現訊息推送(即時聊天)功能. Netty框架,TCP長連線,心跳,阻塞訊息佇列,執行緒池處理訊息傳送, 基於Google ProtoBuf自定義的訊息協議, TCP粘包/拆包.... 客戶端通過TCP連線到伺服器,並建立TCP長連線;當伺服器端收到新訊息後通過TCP連線推送給

O2OA整合政務釘釘實現人員同步、組織同步、單點登入(免登)、待辦待閱訊息

廢話不多說,直接上程式碼。 實現與政務釘釘的人員整合,待辦推送以及單點登入. 將次配置檔案由模版路徑拷貝到config目錄下. 配置檔名: zhengwuDingding.json 模版路徑:o2server/config/sample/zhengwuDingding.json 工作路徑:o

小程式訊息(含原始碼)java實現小程式springboot實現微信訊息

最近需要開發微信和小程式的推送功能,需要用java後臺實現推送,自己本身java和小程式都做,所以就自己動手實現下小程式的模版推送功能推送。 實現思路 1 小程式獲取使用者openid,收集formid傳給java後臺 2 java推送訊息給指定小程式使用

JAVA前後端實現WebSocket訊息(針對性

1、需要新增依賴包,在pom.xml檔案中新增 javax javaee-api 7.0 provided 2、客戶端程式碼 在這裡我為了做成httpsession登入後是同一個,所以我做成兩個頁面,一個登入跳轉頁面,一個用於連結Web

NodeJs 實現IOS APNS 訊息服務

公司的專案要求接入伺服器自己接入原生的ISO 推送服務,不再接第三方的SDK,網上也有很多例子講解什麼是APNS ,如何獲取證書,怎麼接入,剛開始還是聽順利的,就是在獲取pem證書上面有些小問題,不過後來ios開發還是解決了,最後他自己做了一個獲取證書的總結。 我做的就是nodejs 服