消息推送
Android实现推送方式的解决方案
几种常见的解决方案实现原理:
1.轮询(Pull)方式
2.SMS(Push)方式
3.持久连接(Push)方式
解决方案:
1.C2DM云端推送功能,Cloud to Device Messaging(依赖Google云端服务器)
2.MQTT协议实现Android推送功能(wmqtt.jar是IBM提供的MQTT协议的实现)
3.XMPP协议实现Android推送功能
4.使用第三方平台
极光推送
快速集成方式
1.注册开发者账号
2.创建应用
3.推送设置
4.项目导入
发送通知
自定义消息
搭建自己的客户端
https://docs.jiguang.cn/jpush/resources/#android-sdk SDK文档下载
https://docs.jiguang.cn/jpush/client/Android/android_guide/ 集成指南
自动集成方式
sdk配置
添加依赖
配置清单文件
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.example.jpush">
<!-- Required -->
<permission
android:name="com.example.jpush.permission.JPUSH_MESSAGE"
android:protectionLevel="signature" /> <!-- Required 一些系统要求的权限,如访问网络等 -->
<uses-permission android:name="com.example.jpush.permission.JPUSH_MESSAGE" />
<uses-permission android:name="android.permission.RECEIVE_USER_PRESENT" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"
tools:ignore="ProtectedPermissions" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WRITE_SETTINGS"
tools:ignore="ProtectedPermissions" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" /><!-- Android Q后台定位权限-->
<!-- Optional. Required for location feature -->
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /> <!-- 用于开启 debug 版本的应用在6.0 系统上 层叠窗口权限 -->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
<uses-permission android:name="android.permission.GET_TASKS" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme"
android:name=".MyApplication">
<receiver
android:name=".MyReceiver"
android:enabled="true"
android:exported="false" >
<intent-filter>
<action android:name="cn.jpush.android.intent.RECEIVE_MESSAGE" />
<category android:name="com.example.jpush" />
</intent-filter>
</receiver>
<service
android:name=".MyService"
android:enabled="true"
android:exported="false"
android:process=":pushcore">
<intent-filter>
<action android:name="cn.jiguang.user.service.action" />
</intent-filter>
</service>
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
添加一个服务
package com.example.jpush;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import cn.jpush.android.service.JCommonService;
public class MyService extends JCommonService {
public MyService() {
}
}
设置一个接收消息的Receiver
package com.example.jpush;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import cn.jpush.android.api.JPushInterface;
public class MyReceiver extends BroadcastReceiver {
private static final String TAG="JPush";
public MyReceiver() {
}
@Override
public void onReceive(Context context, Intent intent) {
Bundle bundle=intent.getExtras();
Log.d(TAG,"onReceive-"+intent.getAction());
if (JPushInterface.ACTION_REGISTRATION_ID.equals(intent.getAction()))
{
}
else if (JPushInterface.ACTION_MESSAGE_RECEIVED.equals(intent.getAction()))
{
System.out.println("收到了自定义消息。消息内容是:"+bundle.getString(JPushInterface.EXTRA_MESSAGE));
//自定义消息不会展示在通知栏,完全要开发者写代码去处理
}
else if (JPushInterface.ACTION_NOTIFICATION_RECEIVED.equals(intent.getAction()))
{
System.out.println("收到了通知");
//在这里可以做些统计,或者做些其他工作
}
else if (JPushInterface.ACTION_NOTIFICATION_OPENED.equals(intent.getAction()))
{
System.out.println("用户打开了通知");
//在这里可以自己写代码去定义用户点击后的行为
Intent i=new Intent(context,MainActivity.class);
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(i);
}
else
{
Log.d(TAG,"Unhandled intent-"+intent.getAction());
}
}
}
package com.example.jpush;
import android.app.Application;
import cn.jpush.android.api.JPushInterface;
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
JPushInterface.setDebugMode(true);
JPushInterface.init(this);
}
}
设置别名
//设置别名
JPushInterface.setAlias(this, "xx", new TagAliasCallback() {
@Override
public void gotResult(int i, String s, Set<String> set) {
}
});
设置标签
//设置标签
Set<String> tags=new HashSet<>();
tags.add("vince");
JPushInterface.setTags(this, tags, new TagAliasCallback() {
@Override
public void gotResult(int i, String s, Set<String> set) {
}
});
使用极光推送搭建自己的推送服务器
https://docs.jiguang.cn/jpush/server/sdk/java_sdk/