Android 极光推送API
首先是一个知识清单:(对于现在的Android及移动互联网来说,我们需要掌握的技术)泛型原理丶反射原理丶Java虚拟机原理丶线程池原理丶注解原理丶注解原理丶序列化Activity知识体系(Activity的生命周期丶Activity的任务栈丶Activity的启动模式丶View源码丶Fragment内核相关丶service原理等)代码框架结构优化(数据结构丶排序算法丶设计模式)APP性能优化(用户
if (s.trim().length() == 0)
return true;
return false;
}
/**
-
只能以 “+” 或者 数字开头;后面的内容只能包含 “-” 和 数字。
-
*/
private final static String MOBILE_NUMBER_CHARS = “1[-0-9]{1,}$”;
public static boolean isValidMobileNumber(String s) {
if(TextUtils.isEmpty(s)) return true;
Pattern p = Pattern.compile(MOBILE_NUMBER_CHARS);
Matcher m = p.matcher(s);
return m.matches();
}
// 校验Tag Alias 只能是数字,英文字母和中文
public static boolean isValidTagAndAlias(String s) {
Pattern p = Pattern.compile(“^[\u4E00-\u9FA50-9a-zA-Z_!@#KaTeX parse error: Expected 'EOF', got '&' at position 1: &̲*+=.|]+”);
Matcher m = p.matcher(s);
return m.matches();
}
// 取得AppKey
public static String getAppKey(Context context) {
Bundle metaData = null;
String appKey = null;
try {
ApplicationInfo ai = context.getPackageManager().getApplicationInfo(
context.getPackageName(), PackageManager.GET_META_DATA);
if (null != ai)
metaData = ai.metaData;
if (null != metaData) {
appKey = metaData.getString(KEY_APP_KEY);
if ((null == appKey) || appKey.length() != 24) {
appKey = null;
}
}
} catch (NameNotFoundException e) {
}
return appKey;
}
// 取得版本号
public static String GetVersion(Context context) {
try {
PackageInfo manager = context.getPackageManager().getPackageInfo(
context.getPackageName(), 0);
return manager.versionName;
} catch (NameNotFoundException e) {
return “Unknown”;
}
}
public static void showToast(final String toast, final Context context)
{
new Thread(new Runnable() {
@Override
public void run() {
Looper.prepare();
Toast.makeText(context, toast, Toast.LENGTH_SHORT).show();
Looper.loop();
}
}).start();
}
public static boolean isConnected(Context context) {
ConnectivityManager conn = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo info = conn.getActiveNetworkInfo();
return (info != null && info.isConnected());
}
public static String getImei(Context context, String imei) {
String ret = null;
try {
TelephonyManager telephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
ret = telephonyManager.getDeviceId();
} catch (Exception e) {
Logger.e(ExampleUtil.class.getSimpleName(), e.getMessage());
}
if (isReadableASCII(ret)){
return ret;
} else {
return imei;
}
}
private static boolean isReadableASCII(CharSequence string){
if (TextUtils.isEmpty(string)) return false;
try {
Pattern p = Pattern.compile(“[\x20-\x7E]+”);
return p.matcher(string).matches();
} catch (Throwable e){
return true;
}
}
public static String getDeviceId(Context context) {
return JPushInterface.getUdid(context);
}
}
⑤ 修改MainActivity.java
然后是MainActiviity.java
//for receive customer msg from jpush server
private MessageReceiver mMessageReceiver;
public static final String MESSAGE_RECEIVED_ACTION = “com.example.jpushdemo.MESSAGE_RECEIVED_ACTION”;
public static final String KEY_TITLE = “title”;
public static final String KEY_MESSAGE = “message”;
public static final String KEY_EXTRAS = “extras”;
private EditText msgText;
注册消息接收和设置自定义消息
public void registerMessageReceiver() {
mMessageReceiver = new MessageReceiver();
IntentFilter filter = new IntentFilter();
filter.setPriority(IntentFilter.SYSTEM_HIGH_PRIORITY);
filter.addAction(MESSAGE_RECEIVED_ACTION);
LocalBroadcastManager.getInstance(this).registerReceiver(mMessageReceiver, filter);
}
public class MessageReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
try {
if (MESSAGE_RECEIVED_ACTION.equals(intent.getAction())) {
String messge = intent.getStringExtra(KEY_MESSAGE);
String extras = intent.getStringExtra(KEY_EXTRAS);
StringBuilder showMsg = new StringBuilder();
showMsg.append(KEY_MESSAGE + " : " + messge + “\n”);
if (!ExampleUtil.isEmpty(extras)) {
showMsg.append(KEY_EXTRAS + " : " + extras + “\n”);
}
setCostomMsg(showMsg.toString());
}
} catch (Exception e){
}
}
}
//设置自定义消息
private void setCostomMsg(String msg){
if (null != msgText) {
msgText.setText(msg);
msgText.setVisibility(View.VISIBLE);
}
}
然后在onCreate中初始化和调用
JPushInterface.init(getApplicationContext());//极光接口初始化,否则用不了
registerMessageReceiver();//注册消息接收器
现在你就可以运行了
⑥ 发送通知
很好,看到Hello World!了,现在打开极光的控制台
点击进入
因为我已经安装了应用,所以在平台上可以看到新增了一个用户。
设置推送消息
滑动到最下面,广播所有人的意思就是只要是安装了这个应用的人都会收到通知
然后预览
然后你会看到预估人数1,就算你这里是0也没有关系,因为这个平台的数据有时候会有延时,不用担心,大胆的勇敢的点击确认发送通知吧!
发送成功!
而且手机上也收到了通知了
⑦ 点击通知跳转页面
在使用其他的APP的时候点击通知的时候通常会打开不同的页面或者不同的URL,而目前你要是点击这个通知的话就是重新打开当前应用,这显然不是那么的合理,所以当我们需要点击通知跳转到不同页面时,要怎么做呢?
这个方面的功能极光中并没有详细说明,我也是经过反复测试和摸索才总结出来的,回到PushReceiver,在这里之前只做了一个简单的继承,而且是也是在这里做通知点击之后的业务处理的。
因此我需要重写onNotifyMessageOpened方法。它是一个通知栏点击的监听,我只要在点击的时候跳转到其他页面就行了,非常的简单吧。
不过呢?首先需要新建一个页面才行,就取名TestActivity。
然后进入到PushReceiver
package com.llw.pushdemo.receiver;
import android.content.Context;
import android.content.Intent;
import com.llw.pushdemo.TestActivity;
import cn.jpush.android.api.NotificationMessage;
import cn.jpush.android.service.JPushMessageReceiver;
public class PushReceiver extends JPushMessageReceiver {
@Override
public void onNotifyMessageOpened(Context context, NotificationMessage notificationMessage) {
Intent intent = new Intent(context, TestActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP );
context.startActivity(intent);
}
}
很简单的代码对不对,就是跳转页面而已。
下面直接运行吧,通过极光平台发送通知,App收到通知,然后点击通知栏。
这样它就可以跳转到TestActivity页面了。而如果你要携带一些参数呢?
也很简单,
在极光平台上发送通知的时候,配置附加字段。然后回到PushReceiver
然后修改一些activity_test.xml
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android=“http://schemas.android.com/apk/res/android”
xmlns:app=“http://schemas.android.com/apk/res-auto”
xmlns:tools=“http://schemas.android.com/tools”
android:layout_width=“match_parent”
android:layout_height=“match_parent”
android:gravity=“center”
android:orientation=“vertical”
tools:context=“.TestActivity”>
<TextView
android:id=“@+id/tv_test”
android:layout_width=“wrap_content”
android:layout_height=“wrap_content”
android:textColor=“#000”
android:textSize=“20sp” />
然后在TestActivity中
package com.llw.pushdemo;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;
public class TestActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test);
TextView tvTest = findViewById(R.id.tv_test);
String extras = getIntent().getStringExtra(“extras”);
if(extras !=null){
tvTest.setText(extras);
}
}
}
代码也很简单,通过getIntent拿到传递过来的数据,然后显示在TextView上,下面来试试吧。
OK,内容就有了。
⑧ 拓展 应用通知开关监听
你看,就这样实现了。你以为就完了吗?
当然没有完!注意到上面的图是推送消息的记录,目标1,成功1,当然有的手机会收不到通知,这是为什么呢?因为国内的很多手机厂商对Android系统进行了自家系统开发,导致,Android的兼容比较难做,因为有的手机默认应用就不允许接收通知,所以你收不到也不要觉得奇怪,在手机设置里打开通知开关就可以了。
我的是荣耀 20i,默认安装应用就自动打开了这个开关的。
这里就涉及到另一个知识点了,那就是通知开关的监听。举个例子,爱奇艺APP,平时老是给我推送通知,烦得很,然后我就给它关了通知,下次进入APP是会有一个提示
就像这样,基本每个成熟的APP,都会有这个监听的。下面来看看怎么做吧。
无非就是两个方法而已
//是否开启通知接收
private boolean isNotificationEnabled(Context context) {
boolean isOpened = false;
try {
isOpened = NotificationManagerCompat.from(context).areNotificationsEnabled();
} catch (Exception e) {
e.printStackTrace();
isOpened = false;
}
return isOpened;
}
//去设置
private void gotoSet() {
Intent intent = new Intent();
if (Build.VERSION.SDK_INT >= 26) {
// android 8.0引导
intent.setAction(“android.settings.APP_NOTIFICATION_SETTINGS”);
intent.putExtra(“android.provider.extra.APP_PACKAGE”, getPackageName());
} else if (Build.VERSION.SDK_INT >= 21) {
// android 5.0-7.0
intent.setAction(“android.settings.APP_NOTIFICATION_SETTINGS”);
intent.putExtra(“app_package”, getPackageName());
intent.putExtra(“app_uid”, getApplicationInfo().uid);
} else {
// 其他
intent.setAction(“android.settings.APPLICATION_DETAILS_SETTINGS”);
intent.setData(Uri.fromParts(“package”, getPackageName(), null));
}
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
}
然后就是使用方法了
这个时候如果你的这个Demo通知是关闭的话,那么你一打开这个页面就会跳转到通知开启那里去。OK,你以为完了吗?
真的完了!
最后贴一下MainActiviy.java的完整代码
package com.llw.pushdemo;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.NotificationManagerCompat;
import androidx.localbroadcastmanager.content.LocalBroadcastManager;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import cn.jpush.android.api.JPushInterface;
public class MainActivity extends AppCompatActivity {
//for receive customer msg from jpush server
private MessageReceiver mMessageReceiver;
public static final String MESSAGE_RECEIVED_ACTION = “com.example.jpushdemo.MESSAGE_RECEIVED_ACTION”;
public static final String KEY_TITLE = “title”;
public static final String KEY_MESSAGE = “message”;
public static final String KEY_EXTRAS = “extras”;
private EditText msgText;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
JPushInterface.init(getApplicationContext());//极光接口初始化,否则用不了
registerMessageReceiver();//注册消息接收器
//判断该app是否打开了通知,如果没有的话就打开手机设置页面
if (!isNotificationEnabled(this)) {
//开启通知弹窗
gotoSet();
} else {
//当前app允许消息通知
}
}
public void registerMessageReceiver() {
mMessageReceiver = new MessageReceiver();
IntentFilter filter = new IntentFilter();
filter.setPriority(IntentFilter.SYSTEM_HIGH_PRIORITY);
filter.addAction(MESSAGE_RECEIVED_ACTION);
LocalBroadcastManager.getInstance(this).registerReceiver(mMessageReceiver, filter);
}
public class MessageReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
try {
if (MESSAGE_RECEIVED_ACTION.equals(intent.getAction())) {
String messge = intent.getStringExtra(KEY_MESSAGE);
String extras = intent.getStringExtra(KEY_EXTRAS);
StringBuilder showMsg = new StringBuilder();
showMsg.append(KEY_MESSAGE + " : " + messge + “\n”);
if (!ExampleUtil.isEmpty(extras)) {
showMsg.append(KEY_EXTRAS + " : " + extras + “\n”);
}
setCostomMsg(showMsg.toString());
}
} catch (Exception e){
}
}
}
//设置自定义消息
private void setCostomMsg(String msg){
if (null != msgText) {
msgText.setText(msg);
msgText.setVisibility(View.VISIBLE);
}
}
//是否开启通知接收
private boolean isNotificationEnabled(Context context) {
boolean isOpened = false;
try {
isOpened = NotificationManagerCompat.from(context).areNotificationsEnabled();
} catch (Exception e) {
e.printStackTrace();
isOpened = false;
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)
结尾
最后,针对上面谈的内容,给大家推荐一个Android资料,应该对大家有用。
首先是一个知识清单:(对于现在的Android及移动互联网来说,我们需要掌握的技术)
泛型原理丶反射原理丶Java虚拟机原理丶线程池原理丶
注解原理丶注解原理丶序列化
Activity知识体系(Activity的生命周期丶Activity的任务栈丶Activity的启动模式丶View源码丶Fragment内核相关丶service原理等)
代码框架结构优化(数据结构丶排序算法丶设计模式)
APP性能优化(用户体验优化丶适配丶代码调优)
热修复丶热升级丶Hook技术丶IOC架构设计
NDK(c编程丶C++丶JNI丶LINUX)
如何提高开发效率?
MVC丶MVP丶MVVM
微信小程序
Hybrid
Flutter
接下来是资料清单:(敲黑板!!!)
1.数据结构和算法
2.设计模式
3.全套体系化高级架构视频;七大主流技术模块,视频+源码+笔记
4.面试专题资料包(怎么能少了一份全面的面试题总结呢~)
不论遇到什么困难,都不应该成为我们放弃的理由!共勉~
如果你看到了这里,觉得文章写得不错就给个赞呗?如果你觉得那里值得改进的,请给我留言。一定会认真查询,修正不足。谢谢。
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
家有用。**
首先是一个知识清单:(对于现在的Android及移动互联网来说,我们需要掌握的技术)
泛型原理丶反射原理丶Java虚拟机原理丶线程池原理丶
注解原理丶注解原理丶序列化
Activity知识体系(Activity的生命周期丶Activity的任务栈丶Activity的启动模式丶View源码丶Fragment内核相关丶service原理等)
代码框架结构优化(数据结构丶排序算法丶设计模式)
APP性能优化(用户体验优化丶适配丶代码调优)
热修复丶热升级丶Hook技术丶IOC架构设计
NDK(c编程丶C++丶JNI丶LINUX)
如何提高开发效率?
MVC丶MVP丶MVVM
微信小程序
Hybrid
Flutter
[外链图片转存中…(img-RvfqbGJu-1713761583525)]
接下来是资料清单:(敲黑板!!!)
1.数据结构和算法
[外链图片转存中…(img-Ig73sgOv-1713761583526)]
2.设计模式
[外链图片转存中…(img-kM9115C3-1713761583526)]
3.全套体系化高级架构视频;七大主流技术模块,视频+源码+笔记
[外链图片转存中…(img-8ht6BQb6-1713761583527)]
4.面试专题资料包(怎么能少了一份全面的面试题总结呢~)
[外链图片转存中…(img-wfYBmAe3-1713761583528)]
不论遇到什么困难,都不应该成为我们放弃的理由!共勉~
如果你看到了这里,觉得文章写得不错就给个赞呗?如果你觉得那里值得改进的,请给我留言。一定会认真查询,修正不足。谢谢。
[外链图片转存中…(img-KKbab8MD-1713761583529)]
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
+0-9 ↩︎
更多推荐
所有评论(0)