2024年安卓最全Android 极光推送API(1),2024年最新快手面试用什么软件

最后

其实Android开发的知识点就那么多,面试问来问去还是那么点东西。所以面试没有其他的诀窍,只看你对这些知识点准备的充分程度。so,出去面试时先看看自己复习到了哪个阶段就好。

上面分享的百度、腾讯、网易、字节跳动、阿里等公司2021年的高频面试题,博主还把这些技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,上面只是以图片的形式给大家展示一部分。

【Android思维脑图(技能树)】

知识不体系?这里还有整理出来的Android进阶学习的思维脑图,给大家参考一个方向。

【Android高级架构视频学习资源】

**Android部分精讲视频领取学习后更加是如虎添翼!**进军BATJ大厂等(备战)!现在都说互联网寒冬,其实无非就是你上错了车,且穿的少(技能),要是你上对车,自身技术能力够强,公司换掉的代价大,怎么可能会被裁掉,都是淘汰末端的业务Curd而已!现如今市场上初级程序员泛滥,这套教程针对Android开发工程师1-6年的人员、正处于瓶颈期,想要年后突破自己涨薪的,进阶Android中高级、架构师对你更是如鱼得水,赶快领取吧!

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

} 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;

}

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);

}

}

⑨ 源码

源码地址:PushDemo

自学编程路线、面试题集合/面经、及系列技术文章等,资源持续更新中…

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

roid 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);

}

}

⑨ 源码

源码地址:PushDemo

自学编程路线、面试题集合/面经、及系列技术文章等,资源持续更新中…

[外链图片转存中…(img-Zzwu6W4C-1714992187173)]

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 27
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值