最后
最后为了帮助大家深刻理解Android相关知识点的原理以及面试相关知识,这里放上相关的我搜集整理的24套腾讯、字节跳动、阿里、百度2019-2021BAT 面试真题解析,我把大厂面试中常被问到的技术点整理成了视频和PDF(实际上比预期多花了不少精力),包知识脉络 + 诸多细节。
还有 高级架构技术进阶脑图 帮助大家学习提升进阶,也节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。
Android 基础知识点
Java 基础知识点
Android 源码相关分析
常见的一些原理性问题
希望大家在今年一切顺利,进到自己想进的公司,共勉!
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
*/
public class NotifyCompatYc {
public static final String QFMD_CHANNEL_ID = “com.oms.mingdeng”;
public static final String QFMD_CHANNEL_NAME = “祈福明燈”;
public static final String LJMS_DEFAULT_CHANNEL_NAME = “靈機妙算”;
public static final String LJMS_CHANNEL_ID = “com.oms.mmcnotity”;
public static final String XYS_CHANNEL_ID = “com.oms.xuyuanshu”;
public static final String XYS_CHANNEL_NAME = “許願樹”;
public static void setONotifyChannel(NotificationManager manager, NotificationCompat.Builder builder, String channeId, String channelName) {
if (TextUtils.isEmpty(channeId)||TextUtils.isEmpty(channelName)){
L.e("NotifyCompatYc: ".concat(“安卓8.0的通知兼容库中 channeId 与 channelName 不能为empty”));
}
if (Build.VERSION.SDK_INT >= 26) {
//第三个参数设置通知的优先级别
NotificationChannel channel =
new NotificationChannel(channeId, channelName, NotificationManager.IMPORTANCE_DEFAULT);
channel.canBypassDnd();//是否可以绕过请勿打扰模式
channel.canShowBadge();//是否可以显示icon角标
channel.enableLights(true);//是否显示通知闪灯
channel.enableVibration(true);//收到小时时震动提示
channel.setBypassDnd(true);//设置绕过免打扰
channel.setLockscreenVisibility(NotificationCompat.VISIBILITY_SECRET);
channel.setLightColor(Color.RED);//设置闪光灯颜色
channel.getAudioAttributes();//获取设置铃声设置
channel.setVibrationPattern(new long[]{100, 200, 100});//设置震动模式
channel.shouldShowLights();//是否会闪光
if (manager != null) {
manager.createNotificationChannel(channel);
}
if (builder != null) {
builder.setChannelId(channeId);//这个id参数要与上面channel构建的第一个参数对应
}
}
}
public static void setONotifyChannel(NotificationManager manager, String channeId, String channelName) {
setONotifyChannel(manager,null,channeId,channelName);
}
public static Notification getNotification(Context context, String channelId) {
NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(context, channelId);
Notification notification = notificationBuilder.setOngoing(true)
.setSmallIcon(R.drawable.ic_launcher)
.setPriority(NotificationManager.IMPORTANCE_MIN)
.setCategory(Notification.CATEGORY_SERVICE)
.build();
return notification;
}
}
public class NotifyManager {
// 单例开始
private volatile static NotifyManager INSTANCE;
private NotifyManager(Context context) {
initNotifyManager(context);
}
public static NotifyManager getInstance(Context context) {
if (INSTANCE == null) {
synchronized (NotifyManager.class) {
if (INSTANCE == null) {
INSTANCE = new NotifyManager(context);
}
}
}
return INSTANCE;
}
// 单例结束
private NotificationManager manager;
// NotificationManagerCompat
private NotificationCompat.Builder builder;
//初始化通知栏配置
private void initNotifyManager(Context context) {
context = context.getApplicationContext();
manager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
// 如果存在则清除上一个消息
// manager.cancel(news_flag);
builder = new NotificationCompat.Builder(context,NotifyCompatYc.QFMD_CHANNEL_ID);
NotifyCompatYc.setONotifyChannel(manager,builder,NotifyCompatYc.QFMD_CHANNEL_ID,NotifyCompatYc.QFMD_CHANNEL_NAME);
// 设置标题
builder.setContentTitle(context.getResources().getString(R.string.qfmd_notify_title1));
// 状态栏的动画提醒语句
builder.setTicker(context.getResources().getString(R.string.qfmd_notify_ticker));
// 什么时候提醒的
builder.setWhen(System.currentTimeMillis());
// 设置通知栏的优先级
builder.setPriority(Notification.PRIORITY_DEFAULT);
// 设置点击可消失
builder.setAutoCancel(true);
// 设置是否震动等
builder.setDefaults(Notification.DEFAULT_VIBRATE);
// 设置icon
builder.setSmallIcon(R.drawable.lingji_icon);
// 设置点击意图
Intent intent = new Intent(context, GongdenggeActivity.class);
Bundle bundle = new Bundle();
bundle.putBoolean(Contants.INTENT_GOTO_MYLMAP, true);
intent.putExtras(bundle);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
PendingIntent pendingIntent = PendingIntent.getActivity(context, 230, intent, PendingIntent.FLAG_UPDATE_CURRENT);
builder.setContentIntent(pendingIntent);
}
/**
- 显示祈福明灯过期通知
*/
public void showQiFuLampOutOfDateNotify(Context context) {
// 设置内容
builder.setContentText(context.getResources().getString(R.string.qfmd_notify_content1));
manager.notify(13251, builder.build());
}
public void showQiFuLampBlessNotify(Context context) {
builder.setContentText(context.getResources().getString(R.string.qfmd_notify_content2));
manager.notify(13255, builder.build());
}
}
4.3 安装APK
首先在AndroidManifest文件中添加安装未知来源应用的权限:
这样系统会自动询问用户完成授权。当然你也可以先使用 canRequestPackageInstalls()查询是否有此权限,如果没有的话使用Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES这个action将用户引导至安装未知应用权限界面去授权。
private static final int REQUEST_CODE_UNKNOWN_APP = 100;
private void installAPK(){
if (Build.VERSION.SDK_INT >= 26) {
boolean hasInstallPermission = getPackageManager().canRequestPackageInstalls();
if (hasInstallPermission) {
//安装应用
} else {
//跳转至“安装未知应用”权限界面,引导用户开启权限
Uri selfPackageUri = Uri.parse(“package:” + this.getPackageName());
Intent intent = new Intent(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES, selfPackageUri);
startActivityForResult(intent, REQUEST_CODE_UNKNOWN_APP);
}
}else {
//安装应用
}
}
//接收“安装未知应用”权限的开启结果
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQUEST_CODE_UNKNOWN_APP) {
installAPK();
}
}
4.4 SecurityException的闪退
问题原因:项目使用了ActiveAndroid,在 8.0 或 8.1 系统上使用 26 或以上的版本的 SDK 时,调用 ContentResolver 的 notifyChange 方法通知数据更新,或者调用 ContentResolver 的 registerContentObserver 方法监听数据变化时,会出现上述异常。
解决方案:
(1)在清单文件配置
(2)去掉这个监听刷新的方法,改为广播刷新
4.5 静态广播无法正常接收
问题原因: Android 8.0 引入了新的广播接收器限制,因此您应该移除所有为隐式广播 Intent 注册的广播接收器
解决方案: 使用动态广播代替静态广播
4.6 Caused by: java.lang.IllegalStateException: Only fullscreen opaque activities can request orientation
问题原因: Android 8.0 非全屏透明页面不允许设置方向(后面8.1系统谷歌就去掉了这个限制,可能很多人真的不习惯吧)
解决方案:
(1)android:windowIsTranslucent设置为false
(2)如果还是想用的话,就去掉清单文件中Activity中的android:screenOrientation=“portrait”,
(3)就是使用透明的dialog或者PopupWindow来代替,也可以用DialogFragment,看自己的需求和喜好
Android 9.0的适配
9.1 CLEARTEXT communication to life.115.com not permitted by network security policy
问题原因: Android P 限制了明文流量的网络请求,非加密的流量请求都会被系统禁止掉
解决方案:
在资源文件新建xml目录,新建文件
<?xml version="1.0" encoding="utf-8"?>清单文件配置:
但还是建议都使用https进行传输
9.2 其他Api的修改
java.lang.IllegalArgumentException: Invalid Region.Op - only INTERSECT and DIFFERENCE are allowed
最后
给大家送上我成功跳槽复习中所整理的资料,由于文章篇幅有限,所以只是把题目列出来了
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
图片转存中…(img-Z3jbWtmm-1715654374333)]
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!