结语
网上高级工程师面试相关文章鱼龙混杂,要么一堆内容,要么内容质量太浅, 鉴于此我整理了上述安卓开发高级工程师面试题以及答案。希望帮助大家顺利进阶为高级工程师。
目前我就职于某大厂安卓高级工程师职位,在当下大环境下也想为安卓工程师出一份力,通过我的技术经验整理了面试经常问的题,答案部分是一篇文章或者几篇文章,都是我认真看过并且觉得不错才整理出来。
大家知道高级工程师不会像刚入门那样被问的问题一句话两句话就能表述清楚,所以我通过过滤好文章来帮助大家理解。
现在都说互联网寒冬,其实只要自身技术能力够强,咱们就不怕!我这边专门针对Android开发工程师整理了一套【Android进阶学习视频】、【全套Android面试秘籍】、【Android知识点PDF】。
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
Toast.makeText(UpdateActivity.this, “权限不足,无法下载更新。”, Toast.LENGTH_LONG).show();
}
}
});
这里就提一点:request方法是当申请多个权限的时候,只要有一个权限用户不同意授予,aBoolean就会为false,如果想要为每个权限的授予专门做处理,可以把request改为requestEach。更多的使用还是请看上面的相关文章链接。
注意:由于在请求权限的过程中app有可能会被重启,所以权限请求必须放在初始化的阶段,比如在Activity.onCreate/onResume, 或者View.onFinishInflate方法中。如果不这样处理,那么如果app在请求过程中重启的话,权限请求结果将不会发送给订阅者即subscriber。
4.好了。现在我们也已经把下载APK的所需的权限也搞定了,当用户同意授予相应的权限的时候,接下去就是跳出对话框,询问用户是否需要更新APK,这里就是单纯的创建一个对话框询问即可,估计大家都会,直接上代码:
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle(“提示标题”);
builder.setMessage(“提示内容”);
builder.setNegativeButton(“取消”, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
dialogInterface.dismiss();
Toast.makeText(UpdateActivity.this, “取消更新。”, Toast.LENGTH_LONG).show();
}
});
builder.setPositiveButton(“确定”, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
//进入下一步,去确定是WiFi还是流量
confirmWifi();
}
});
//让对话框不能通过点击返回按钮或者其他区域让对话框消失
builder.setCancelable(false);
builder.create().show();
5.用户如果点击确定按钮。然后我们这时候就要判断,是不是WiFi情况下,如果是WiFi情况下就直接进行更新,如果不是,再创建对话框,然后询问用户,是否确定需要通过流量来进行下载:
public void confirmWifi(){
if(isWiFi(UpdateActivity.this)){
startService(new Intent(UpdateActivity.this, UpdateService.class));
Toast.makeText(UpdateActivity.this, “开始下载。”, Toast.LENGTH_LONG).show();
}else{
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle(“提示”);
builder.setMessage(“是否要用流量进行下载更新”);
builder.setNegativeButton(“取消”, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
dialogInterface.dismiss();
Toast.makeText(UpdateActivity.this, “取消更新。”, Toast.LENGTH_LONG).show();
}
});
builder.setPositiveButton(“确定”, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
startService(new Intent(UpdateActivity.this, UpdateService.class));
Toast.makeText(UpdateActivity.this, “开始下载。”, Toast.LENGTH_LONG).show();
}
});
builder.setCancelable(false);
builder.create().show();
}
}
//判断是不是WiFi状态
public static boolean isWiFi(Context cxt) {
ConnectivityManager cm = (ConnectivityManager) cxt
.getSystemService(Context.CONNECTIVITY_SERVICE);
// wifi的状态:ConnectivityManager.TYPE_WIFI
// 3G的状态:ConnectivityManager.TYPE_MOBILE
NetworkInfo.State state = cm.getNetworkInfo(ConnectivityManager.TYPE_WIFI)
.getState();
return NetworkInfo.State.CONNECTED == state;
}
记得查询当前是不是WiFi状态也要加权限:
然后我们就startService(new Intent(UpdateActivity.this, UpdateService.class));
来进行接下去的下载之路,因为一般下载都是在后台,所以都是放在Service中进行操作的。
这里我顺便放篇链接,关于Service的,觉得写得不错,大家可以看下:
6.我们前面的条件都ok了。用户也都按了确定之后,就开始我们正式的下载之路,启动Service来进行相关的后续操作:
第六个部分我会分几块来讲解
- 下载APK — DownLoadManager
基本的使用及介绍大家看下面文章介绍:
所以我们通过DownLoadManager来进行APK的下载,代码如下:
public void downApk() {
//当发现本地以及有该APK的时候先进行删除再下载,不然下载下来多次之后手机自动会变成Chint-1.apk,Chint-2.apk等
File apkFile = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).getPath()+“/Chint.apk”);
if(apkFile.exists()){
Toast.makeText(this,“已经有apk存在,将要删除”,Toast.LENGTH_LONG).show();
apkFile.delete();
}
DownloadManager manager = (DownloadManager) getSystemService(DOWNLOAD_SERVICE);
DownloadManager.Request request = new DownloadManager.Request(Uri.parse(DOWNURL));
request.setMimeType(“application/vnd.android.package-archive”);
//request.setDescription(“XXXX”);
//request.setTitle(“XXX”);
request.setDestinationInExternalPublicDir(
Environment.DIRECTORY_DOWNLOADS, “Chint.apk”);
request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE);
manager.enqueue(request);
}
(题外话:还有一种下载是通过浏览器去下载:
浏览器下载
将下载链接使用浏览器打开,把下载任务交给浏览器,让浏览器调用系统下载器去下载,下载过程在通知栏有下载进度,下载完后文件通常存放在 “外部存储器” 根目录下的 download 文件夹, 也就是: /mnt/sdcard/download。
打开下载链接的 Intent:
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.addCategory(Intent.CATEGORY_BROWSABLE);
intent.setData(Uri.parse(“下载链接”));
startActivity(intent);
使用这种方法下载完全把工作交给了系统应用,自己的应用中不需要申请任何权限,方便简单快捷。但如此我们也不能知道下载文件的大小,不能监听下载进度和下载结果。本Demo中没使用,当然这个也可以。)
- 如何知道下载完成
我们已经把APK下载下来了,那我们需要再APK下载完成后进行安装,那我们什么时候知道APK下载完成呢,让我们来看下有没有方法可以用,当然有方法可以知道 (这B装的我好累,休息一下。),当DownLoadManager下载完成后,会发送一个DownloadManager.ACTION_DOWNLOAD_COMPLETE
的广播,所以我们只要刚开始在启动Service的时候,注册一个广播,监听
DownloadManager.ACTION_DOWNLOAD_COMPLETE
,然后当下载完成后,在BroadcastReceiver中调用安装APK的方法即可。是不是很方便。
public void receiverRegist() {
receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
installApk(context);
stopSelf();
}
};
IntentFilter filter = new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE);
registerReceiver(receiver, filter);
}
然后进行安装APK,安装结束后调用stopSelf();来摧毁这个Service当Service被摧毁的时候,要记得注销这个广播哦:
@Override
public void onDestroy() {
unregisterReceiver(receiver);
super.onDestroy();
}
- 安装APK:
结语
看到这篇文章的人不知道有多少是和我一样的Android程序员。
35岁,这是我们这个行业普遍的失业高发阶段,这种情况下如果还不提升自己的技能,进阶发展,我想,很可能就是本行业的职业生涯的终点了。
我们要有危机意识,切莫等到一切都成定局时才开始追悔莫及。只要有规划的,有系统地学习,进阶提升自己并不难,给自己多充一点电,你才能走的更远。
千里之行始于足下。这是上小学时,那种一元钱一个的日记本上每一页下面都印刷有的一句话,当时只觉得这句话很短,后来渐渐长大才慢慢明白这句话的真正的含义。
有了学习的想法就赶快行动起来吧,不要被其他的事情牵绊住了前行的脚步。不要等到裁员时才开始担忧,不要等到面试前一晚才开始紧张,不要等到35岁甚至更晚才开始想起来要学习要进阶。
给大家一份系统的Android学习进阶资料,希望这份资料可以给大家提供帮助。
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
前行的脚步。不要等到裁员时才开始担忧,不要等到面试前一晚才开始紧张,不要等到35岁甚至更晚才开始想起来要学习要进阶。
给大家一份系统的Android学习进阶资料,希望这份资料可以给大家提供帮助。
[外链图片转存中…(img-PRBUk9RG-1715851008449)]
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!