总结
现在新技术层出不穷,如果每次出新的技术,我们都深入的研究的话,很容易分散精力。新的技术可能很久之后我们才会在工作中用得上,当学的新技术无法学以致用,很容易被我们遗忘,到最后真的需要使用的时候,又要从头来过(虽然上手会更快)。
我觉得身为技术人,针对新技术应该是持拥抱态度的,入了这一行你就应该知道这是一个活到老学到老的行业,所以面对新技术,不要抵触,拥抱变化就好了。
Flutter 明显是一种全新的技术,而对于这个新技术在发布之初,花一个月的时间学习它,成本确实过高。但是周末花一天时间体验一下它的开发流程,了解一下它的优缺点、能干什么或者不能干什么。这个时间,并不是我们不能接受的。
如果有时间,其实通读一遍 Flutter 的文档,是最全面的一次对 Flutter 的了解过程。但是如果我们只有 8 小时的时间,我希望能关注一些最值得关注的点。
(跨平台开发(Flutter)、java基础与原理,自定义view、NDK、架构设计、性能优化、完整商业项目开发等)
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
MainActivity2.this);
View v = inflater.inflate(R.layout.layout_notif_dialog, null);
TextView tvMessage = v.findViewById(R.id.tv_message);
tvMessage.setText(R.string.label_notiy_message);
Button btnCancel = v.findViewById(R.id.btn_cancel);
Button btnSubmit = v.findViewById(R.id.btn_submit);
btnCancel.setText(R.string.label_notiy_cancel);
btnSubmit.setText(R.string.label_notiy_submit);
final AlertDialog dialog = builder.create();
dialog.show();
dialog.getWindow().setContentView(v);
dialog.getWindow().setGravity(Gravity.CENTER);
btnCancel.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dialog.dismiss();
}
});
btnSubmit.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dialog.dismiss();
NotificationUtils.openPush(MainActivity2.this);
}
});
}
NotificationUtils 通知类
/**
- desc:通知生成类
*/
public class NotificationUtils extends ContextWrapper {
/**
- 通知管理对象
*/
private NotificationManager notificationManager;
/**
- channel的ID
*/
public static final String id = “channel_id”;
/**
- channel的名称
*/
public static final String name = “channel_name”;
/**
- notification id
*/
public static final int notification_id = 1;
//最多显示3条通知
public int NOTIFICATION_SHOW_SHOW_AT_MOST = 3;
/**
- 通知生成类的构造方法
*/
public NotificationUtils(Context context) {
super(context);
initWindowManager(context);
}
private WindowManager.LayoutParams mWindowParams;
private WindowManager mWindowManager;
private void initWindowManager(Context context) {
mWindowParams = new WindowManager.LayoutParams();
mWindowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
if (Build.VERSION.SDK_INT >= 26) {//8.0新特性
mWindowParams.type = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;
} else {
mWindowParams.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT;
}
}
/**
-
模拟发送一个普通通知
-
@param iconRes
-
@param title
-
@param content
-
@param pendingIntent
*/
public void sendNotification(int iconRes, String title, String content, PendingIntent pendingIntent) {
// int num = SaveUtil.getNotiyNum();
// num++;
// SaveUtil.saveNotiyNum(num);
// //通知条数<10
// if (SaveUtil.getNotiyNum() > NOTIFICATION_SHOW_SHOW_AT_MOST) {
// SaveUtil.saveNotiyNum(1);
// }
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
//26及以上
createNotificationChannel();
Notification notification = getChannelNotification(iconRes, title, content, pendingIntent).build();
notificationManager.notify(notification_id, notification);
// notificationManager.notify(SaveUtil.getNotiyNum(), notification);
} else {
getNotificationManager();
Notification notification = getNotification(iconRes, title, content, pendingIntent).build();
notificationManager.notify(notification_id, notification);
// notificationManager.notify(SaveUtil.getNotiyNum(), notification);
}
}
/**
- 创建NotificationChannel
*/
public void createNotificationChannel() {
NotificationChannel notificationChannel = null;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
// notificationChannel = new NotificationChannel(id, name, NotificationManager.IMPORTANCE_DEFAULT);
// notificationChannel.canBypassDnd();//可否绕过请勿打扰模式
// notificationChannel.canShowBadge();//桌面lanchener显示角标
// notificationChannel.enableLights(true);//闪光
// notificationChannel.shouldShowLights();//闪光
// notificationChannel.setLockscreenVisibility(Notification.VISIBILITY_SECRET);//锁屏显示通知
// notificationChannel.enableVibration(true);//是否允许震动
// notificationChannel.setVibrationPattern(new long[]{100, 100, 200});//设置震动模式
// notificationChannel.getAudioAttributes();//获取系统响铃配置
// notificationChannel.getGroup();//获取消息渠道组
// notificationChannel.setBypassDnd(true);
// notificationChannel.setDescription(“description”);
// notificationChannel.setLightColor(Color.GREEN);//制定闪灯是灯光颜色
// notificationChannel.setShowBadge(true);
// getNotificationManager().createNotificationChannel(notificationChannel);
//第一个参数:channel_id
//第二个参数:channel_name
//第三个参数:设置通知重要性级别
//注意:该级别必须要在 NotificationChannel 的构造函数中指定,总共要五个级别;
//范围是从 NotificationManager.IMPORTANCE_NONE(0) ~ NotificationManager.IMPORTANCE_HIGH(4)
NotificationChannel channel = new NotificationChannel(id, name,
NotificationManager.IMPORTANCE_DEFAULT);
// channel.canBypassDnd();//是否绕过请勿打扰模式
channel.enableLights(true);//闪光灯
channel.setLockscreenVisibility(VISIBILITY_SECRET);//锁屏显示通知
channel.setLightColor(Color.RED);//闪关灯的灯光颜色
channel.canShowBadge();//桌面launcher的消息角标
channel.enableVibration(true);//是否允许震动
channel.getAudioAttributes();//获取系统通知响铃声音的配置
channel.getGroup();//获取通知取到组
channel.setBypassDnd(true);//设置可绕过 请勿打扰模式
channel.setVibrationPattern(new long[]{100, 100, 200});//设置震动模式
channel.shouldShowLights();//是否会有灯光
getNotificationManager().createNotificationChannel(channel);
}
}
/**
-
获取通知管理者对象
-
@return
*/
public NotificationManager getNotificationManager() {
if (notificationManager == null) {
notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
}
return notificationManager;
}
/**
- 对应Android8.0生成notification的方法,通过此方法获取notification
*/
public Notification.Builder getChannelNotification(int iconRes, String title, String content, PendingIntent pendingIntent) {
Notification.Builder builder = null;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
builder = new Notification.Builder(getApplicationContext(), id);
builder.setSmallIcon(iconRes);
builder.setAutoCancel(true);
builder.setChannelId(id);
builder.setWhen(System.currentTimeMillis());
builder.setContentTitle(title);
//设置显示通知时间
builder.setShowWhen(true);
builder.setContentText(content);
builder.setNumber(3);
builder.setOnlyAlertOnce(false);
//悬停通知
builder.setTicker(content);
builder.setDefaults(~0);
builder.setPriority(Notification.PRIORITY_DEFAULT);
// builder.setVisibility(Notification.VISIBILITY_PUBLIC);
// builder.setFullScreenIntent(pendingIntent, true);
builder.setContentIntent(pendingIntent);
}
return builder;
}
private int priority = Notification.PRIORITY_DEFAULT;
/**
- 对应Android8.0以下的notification对象
*/
public NotificationCompat.Builder getNotification(int iconRes, String title, String content, PendingIntent pendingIntent) {
// NotificationCompat.Builder builder = new NotificationCompat.Builder(getApplicationContext());
NotificationCompat.Builder builder = new NotificationCompat.Builder(getApplicationContext(), id);
builder.setPriority(NotificationCompat.PRIORITY_MAX);
builder.setSmallIcon(iconRes);
builder.setAutoCancel(true);
builder.setWhen(System.currentTimeMillis());
builder.setContentTitle(title); //设置标题
builder.setContentText(content);
builder.setDefaults(Notification.DEFAULT_VIBRATE);//设置振动声音等,需要振动权限
builder.setContentIntent(pendingIntent); //自定义打开的界面
//悬停通知
builder.setTicker(title);
builder.setDefaults(~0);
builder.setPriority(Notification.PRIORITY_HIGH);
// if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {//SDK版本>=21才能设置悬挂式通知栏
// builder.setCategory(String.valueOf(Notification.FLAG_ONGOING_EVENT))
// .setVisibility(Notification.VISIBILITY_PUBLIC);
// }
// builder.setVisibility(Notification.VISIBILITY_PUBLIC);
// builder.setFullScreenIntent(pendingIntent, true);
//点击自动删除通知
builder.setAutoCancel(true);
return builder;
}
// public static boolean isNotificationEnabled(Context context,String channelId) {
// return NotificationManagerCompat.from(context.getApplicationContext()).areNotificationsEnabled();
// }
// public static boolean isNotificationEnabled(Context context,String channelId) {
// NotificationManagerCompat managerCompat = NotificationManagerCompat.from(context);
// NotificationManager manager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
// boolean returnValue = managerCompat.areNotificationsEnabled();
// if(manager == null || Build.VERSION.SDK_INT < Build.VERSION_CODES.O){
// return returnValue;
// }
// NotificationChannel channel = manager.getNotificationChannel(channelId);
// if(channel == null){
// channel = new NotificationChannel(channelId,“我的推送类别”,NotificationManager.IMPORTANCE_HIGH);
// manager.createNotificationChannel(channel);
//
// //下面的获取操作必需,创建的channel和获取到的channel的IMPORTANCE可能不一样,OPPO默认IMPORTANCE_NONE。
最后,面试前该准备哪些资源复习?
其实客户端开发的知识点就那么多,面试问来问去还是那么点东西。所以面试没有其他的诀窍,只看你对这些知识点准备的充分程度。so,出去面试时先看看自己复习到了哪个阶段就好。
这里再分享一下我面试期间的复习路线:(以下体系的复习资料是我从各路大佬收集整理好的)
《Android开发七大模块核心知识笔记》
《960全网最全Android开发笔记》
《379页Android开发面试宝典》
历时半年,我们整理了这份市面上最全面的安卓面试题解析大全
包含了腾讯、百度、小米、阿里、乐视、美团、58、猎豹、360、新浪、搜狐等一线互联网公司面试被问到的题目。熟悉本文中列出的知识点会大大增加通过前两轮技术面试的几率。
《507页Android开发相关源码解析》
只要是程序员,不管是Java还是Android,如果不去阅读源码,只看API文档,那就只是停留于皮毛,这对我们知识体系的建立和完备以及实战技术的提升都是不利的。
真正最能锻炼能力的便是直接去阅读源码,不仅限于阅读各大系统源码,还包括各种优秀的开源库。
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
801392)]
《379页Android开发面试宝典》
历时半年,我们整理了这份市面上最全面的安卓面试题解析大全
包含了腾讯、百度、小米、阿里、乐视、美团、58、猎豹、360、新浪、搜狐等一线互联网公司面试被问到的题目。熟悉本文中列出的知识点会大大增加通过前两轮技术面试的几率。
《507页Android开发相关源码解析》
只要是程序员,不管是Java还是Android,如果不去阅读源码,只看API文档,那就只是停留于皮毛,这对我们知识体系的建立和完备以及实战技术的提升都是不利的。
真正最能锻炼能力的便是直接去阅读源码,不仅限于阅读各大系统源码,还包括各种优秀的开源库。
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!