首页 文章 精选 留言 我的

精选列表

搜索[集合],共10003篇文章
优秀的个人博客,低调大师

android开发系列文章集合

Android 技术专题系列之二 -- telephonyAndroid 技术专题系列之三 -- 编译(build) 流程Android 技术专题系列之四 -- 网络资源及常见命令备Android 技术专题系列之五- 本地化Android 技术专题系列之六 --如何安装.apk到模拟Android 技术专题系列之七 -- 输入法 框架Android 技术专题系列之八 -- 浏览器及web widgetAndroid 技术专题系列之九 -- 图形系统Android 技术专题系列之十 -- Audio managerAndroid 技术专题系列之十一 -- DRMAndroid 技术专题系列之十二 -- Alarm managerAndroid 技术专题系列之十五 -- 更新开发手机到1.5Android 技术专题系列之十六 -- 在模拟器上安装 sdAndroid 技术专题系列之十七 -- volume 服务Android 技术专题系列之十八-- 媒体文件管理Android 技术专题系列之十九-- AppwidgetAndroid系列之二十-- 在eclipse中浏览Android源码Android系列之二十三 -- message queueAndroid系列之二十四 -- home screenAndroid系列之Post图片和数据Android系列之Intent传递对象的两种方法Android系列之如何使用Alarm 分类: Android开发 本文转自qianqianlianmeng博客园博客,原文链接:http://www.cnblogs.com/aimeng/archive/2012/01/18/2325379.html ,如需转载请自行联系原作者

优秀的个人博客,低调大师

Android各版本迭代信息集合

前言 今天分享的面试题是: Android在版本迭代中,总会进行很多改动,那么你熟知各版本都改动了什么内容?又要怎么适配呢? Android4.4 发布 ART虚拟机,提供选项可以开启。 HttpURLConnection的底层实现改为了OkHttp。 Android5.0 ART成为默认虚拟机,完全代替Dalvik虚拟机。 Context.bindService() 方法需要显式 Intent,如果提供隐式 intent,将引发异常。 Android6.0 增加运行时权限限制 如果你的应用使用到了危险权限,比如在运行时进行检查和请求权限。checkSelfPermission()方法用于检查权限,requestPermissions() 方法用于请求权限。 取消支持Apache HTTP Android 6.0 版移除了对 Apache HTTP相关类库的支持。要继续使用 Apache HTTP API,您必须先在 build.gradle 文件中声明以下编译时依赖项: android{useLibrary'org.apache.http.legacy'} 有的小伙伴可能不熟悉这是啥,简单说下: Apache HttpClient 是Apache开源组织提供的一个开源的项目,它是一个简单的HTTP客户端(并不是浏览器),可以发送HTTP请求,接受HTTP响应。 所以说白了,其实就是一个请求网络的项目框架。 Android 7.0 Android 7.0 引入一项新的应用签名方案 APK Signature Scheme v2 Toast导致的BadTokenException 在Android7.0系统上,Android 框架强制执行了 StrictMode API 政策禁止向你的应用外公开 file:// URI。如果一项包含文件 file:// URI类型 的 Intent 离开你的应用,应用失败,并出现 FileUriExposedException 异常,如调用系统相机拍照录制视频,或裁切照片。 这一点其实就是限制了在应用间共享文件,如果需要在应用间共享,需要授予要访问的URI临时访问权限,我们要做的就是注册FileProvider: 1)声明FileProvider。 <providerandroid:name="android.support.v4.content.FileProvider"android:authorities="app的包名.fileProvider"android:grantUriPermissions="true"android:exported="false"><meta-dataandroid:name="android.support.FILE_PROVIDER_PATHS"android:resource="@xml/file_paths"/></provider><!--androidx版本类路径为:androidx.core.content.FileProvider--> 2)编写xml文件,确定可访问的目录 <pathsxmlns:android="http://schemas.android.com/apk/res/android">//代表设备的根目录newFile("/");<root-pathname="root"path="."/>//context.getFilesDir()<files-pathname="files"path="."/>//context.getCacheDir()<cache-pathname="cache"path="."/>//Environment.getExternalStorageDirectory()<external-pathname="external"path="."/>//context.getExternalFilesDirs()<external-files-pathname="name"path="path"/>//getExternalCacheDirs()<external-cache-pathname="name"path="path"/></paths> 3)使用FileProvider if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.N){Uriuri=FileProvider.getUriForFile(CameraActivity.this,"app的包名.fileProvider",photoFile);}else{Uriuri=Uri.fromFile(photoFile);} Android8.0 修改运行时权限错误 在 Android 8.0 之前,如果应用在运行时请求权限并且被授予该权限,系统会错误地将属于同一权限组并且在清单中注册的其他权限也一起授予应用。对于针对 Android 8.0 的应用,系统只会授予应用明确请求的权限。然而,一旦用户为应用授予某个权限,则所有后续对该权限组中权限的请求都将被自动批准。 也就是说,以前你申请了READ_EXTERNAL_STORAGE权限,应用会同时给你授予同权限组的WRITE_EXTERNAL_STORAGE权限。如果Android8.0以上,只会给你授予你请求的READ_EXTERNAL_STORAGE权限。如果需要WRITE_EXTERNAL_STORAGE权限,还要单独申请,不过系统会立即授予,不会提示。 修改通知 Android 8.0 对于通知修改了很多,比如通知渠道、通知标志、通知超时、背景颜色。其中比较重要的就是通知渠道,其允许您为要显示的每种通知类型创建用户可自定义的渠道。 这样的好处就是对于某个应用可以把权限分成很多类,用户来控制是否显示哪些类别的通知。而开发者要做的就是必须设置这个渠道id,否则通知可能会失效。 privatevoidcreateNotificationChannel(){if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.O){NotificationManagernotificationManager=(NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);//分组(可选)//groupId要唯一StringgroupId="group_001";NotificationChannelGroupgroup=newNotificationChannelGroup(groupId,"广告");//创建groupnotificationManager.createNotificationChannelGroup(group);//channelId要唯一StringchannelId="channel_001";NotificationChanneladChannel=newNotificationChannel(channelId,"推广信息",NotificationManager.IMPORTANCE_DEFAULT);//补充channel的含义(可选)adChannel.setDescription("推广信息");//将渠道添加进组(先创建组才能添加)adChannel.setGroup(groupId);//创建channelnotificationManager.createNotificationChannel(adChannel);//创建通知时,标记你的渠道idNotificationnotification=newNotification.Builder(MainActivity.this,channelId).setSmallIcon(R.mipmap.ic_launcher).setLargeIcon(BitmapFactory.decodeResource(getResources(),R.mipmap.ic_launcher)).setContentTitle("一条新通知").setContentText("这是一条测试消息").setAutoCancel(true).build();notificationManager.notify(1,notification);}} 悬浮窗 Android8.0以上必须使用新的窗口类型(TYPE_APPLICATION_OVERLAY)才能显示提醒悬浮窗: if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.O){mWindowParams.type=WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY}else{mWindowParams.type=WindowManager.LayoutParams.TYPE_SYSTEM_ALERT} 不允许安装未知来源的应用 Android 8.0去除了“允许未知来源”选项,所以如果我们的App有安装App的功能(检查更新之类的),那么会无法正常安装。 <uses-permissionandroid:name="android.permission.REQUEST_INSTALL_PACKAGES"/>privatevoidinstallAPK(){if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.O){booleanhasInstallPermission=getPackageManager().canRequestPackageInstalls();if(hasInstallPermission){//安装应用}else{//跳转至“安装未知应用”权限界面,引导用户开启权限UriselfPackageUri=Uri.parse("package:"+this.getPackageName());Intentintent=newIntent(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES,selfPackageUri);startActivityForResult(intent,100);}}else{//安装应用}}//接收“安装未知应用”权限的开启结果@OverrideprotectedvoidonActivityResult(intrequestCode,intresultCode,Intentdata){super.onActivityResult(requestCode,resultCode,data);if(requestCode==100){installAPK();}} Only fullscreen opaque activities can request orientation 只有全屏不透明的activity才可以设置方向。这应该是个bug,在Android8.0中出现,8.1中被修复。 我们的处理办法就是要么去掉设置方向的代码,要么舍弃透明效果。 Android9.0 在9.0中默认情况下启用网络传输层安全协议 (TLS),默认情况下已停用明文支持。也就是不允许使用http请求,要求使用 https。解决办法就是添加网络安全配置: <applicationandroid:networkSecurityConfig="@xml/network_security_config"><network-security-config><base-configcleartextTrafficPermitted="true"/></network-security-config><!--或者在AndroidManifest.xml中配置:android:usesCleartextTraffic="true"--> 移除Apache HTTP 客户端 在6.0中取消了对Apache HTTP 客户端的支持,Android9.0中直接移除了该库,要使用的话需要添加配置: <uses-libraryandroid:name="org.apache.http.legacy"android:required="false"/> 前台服务调用 Android 9.0 要求创建一个前台服务需要请求 FOREGROUND_SERVICE 权限,否则系统会引发 SecurityException。 <uses-permissionandroid:name="android.permission.FOREGROUND_SERVICE"/>if(android.os.Build.VERSION.SDK_INT>=android.os.Build.VERSION_CODES.O){startForegroundService(intentService);}else{startService(intentService);} 不能在非Acitivity环境中启动Activity 在9.0 中,不能直接非 Activity 环境中(比如Service,Application)启动 Activity,否则会崩溃报错,解决办法就是加上FLAG_ACTIVITY_NEW_TASK Intentintent=newIntent(this,TestActivity.class);intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);startActivity(intent); Android10 分区存储 Android10中默认开启了分区存储,也就是沙盒模式。应用只能看到本应用专有的目录(通过 Context.getExternalFilesDir() 访问)以及特定类型的媒体。 如果需要关闭这个功能可以配置: android:requestLegacyExternalStorage="true" 分区存储下,访问文件的方法: 1)应用专属目录 //分区存储空间valfile=File(context.filesDir,filename)//应用专属外部存储空间valappSpecificExternalDir=File(context.getExternalFilesDir(),filename) 2)访问公共媒体目录文件 valcursor=contentResolver.query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,null,null,null,"${MediaStore.MediaColumns.DATE_ADDED}desc")if(cursor!=null){while(cursor.moveToNext()){valid=cursor.getLong(cursor.getColumnIndexOrThrow(MediaStore.MediaColumns._ID))valuri=ContentUris.withAppendedId(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,id)println("imageuriis$uri")}cursor.close()} 3)SAF(存储访问框架--Storage Access Framework) valintent=Intent(Intent.ACTION_OPEN_DOCUMENT)intent.addCategory(Intent.CATEGORY_OPENABLE)intent.type="image/*"startActivityForResult(intent,100)@RequiresApi(Build.VERSION_CODES.KITKAT)overridefunonActivityResult(requestCode:Int,resultCode:Int,data:Intent?){super.onActivityResult(requestCode,resultCode,data)if(data==null||resultCode!=Activity.RESULT_OK)returnif(requestCode==100){valuri=data.dataprintln("imageuriis$uri")}} 权限再次升级 从Android10开始普通应用不再允许请求权限android.permission.READ_PHONE_STATE。而且,无论你的App是否适配过Android Q(既targetSdkVersion是否大于等于29),均无法再获取到设备IMEI等设备信息。 如果Android10以下设备获取设备IMEI等信息,可以配置最大sdk版本: <uses-permissionandroid:name="android.permission.READ_PHONE_STATE"android:maxSdkVersion="28"/> Android 11 分区存储强制执行 没错,Android11强制执行分区存储,也就是沙盒模式。这次真的没有关闭功能了,离Android11出来也有一段时间了,还是抓紧适配把。 修改电话权限 改动了两个API:getLine1Number()和 getMsisdn() ,需要加上READ_PHONE_NUMBERS权限 不允许自定义toast从后台显示了 必须加上v2签名 增加5g相关API 后台位置访问权限再次限制 你一定很奇怪,为什么Android11的适配就这么草草收尾了?这可是我们最需要的啊? 哈哈,因为改动还是挺多的,所以给你推荐文章—Android11最全适配指南,应该有很多朋友都看过了:https://juejin.cn/post/6860370635664261128,或者点击文末的“阅读原文”即可。 参考 https://juejin.cn/post/6898176468661059597 https://blog.csdn.net/qq_17766199/article/details/80965631 https://weilu.blog.csdn.net/article/details/98336225 拜拜 本文分享自微信公众号 - 码上积木(Lzjimu)。如有侵权,请联系 support@oschina.cn 删除。本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

优秀的个人博客,低调大师

Spring Boot教程全集-修正集合

修正1:20 使用Caching-Redis 位置:com.roncoo.education.cache.impl.RoncooUserLogCacheImpl,第34行,@CachePut(key = "#p0") 正确:@CachePut(key = "#p0.id") 原因:key值定义写错。#p0是指使用第一个参数作为key值,上面selectById是将主键作为key,如果更新将对象作为key,则会导致更新之后,查找不到最新的信息,对象作为key,因为修改,会每修改一次都产生一条记录,因为每个对象的属性都会变化 感谢学员(你的微笑、很美)的发现。 修正2:31 生产部署-注意事项和如何使用脚本 位置:kill -9 ${procedure}(第一个kill的位置) 正确:kill ${procedure} 原因:kill -9 是立即杀死应用,第一关闭的时候,不应该是杀死,这样就无法令spring boot应用进行优雅关机,当kill不成功的时候,才考虑进行kill -9。

优秀的个人博客,低调大师

Java 集合框架 ArrayList 源码剖析

ArrayList实现了List接口,是顺序容器,即元素存放的数据与放进去的顺序相同,允许放入null元素,底层通过数组实现。除该类未实现同步外,其余跟Vector大致相同。每个ArrayList都有一个容量(capacity),表示底层数组的实际大小,容器内存储元素的个数不能多于当前容量。当向容器中添加元素时,如果容量不足,容器会自动增大底层数组的大小。前面已经提过,Java泛型只是编译器提供的语法糖,所以这里的数组是一个Object数组,以便能够容纳任何类型的对象。 size(), isEmpty(), get(), set()方法均能在常数时间内完成,add()方法的时间开销跟插入位置有关,addAll()方法的时间开销跟添加元素的个数成正比。其余方法大都是线性时间。 为追求效率,ArrayList没有实现同步(synchronized),如果需要多个线程并发访问,用户可以手动同步,也可使用Vector替代。 方法剖析 set() 既然底层是一个数组ArrayList的set()方法也就变得非常简单,直接对数组的指定位置赋值即可。 public E set(int index, E element) { rangeCheck(index);//下标越界检查 E oldValue = elementData(index); elementData[index] = element;//赋值到指定位置,复制的仅仅是引用 return oldValue; } get() get()方法同样很简单,唯一要注意的是由于底层数组是Object[],得到元素后需要进行类型转换。 public E get(int index) { rangeCheck(index); return (E) elementData[index];//注意类型转换 } add() 跟C++ 的vector不同,ArrayList没有bush_back()方法,对应的方法是add(E e),ArrayList也没有insert()方法,对应的方法是add(int index, E e)。这两个方法都是向容器中添加新元素,这可能会导致capacity不足,因此在添加元素之前,都需要进行剩余空间检查,如果需要则自动扩容。扩容操作最终是通过grow()方法完成的。 private void grow(int minCapacity) { int oldCapacity = elementData.length; int newCapacity = oldCapacity + (oldCapacity >> 1);//原来的3倍 if (newCapacity – minCapacity < 0) newCapacity = minCapacity; if (newCapacity – MAX_ARRAY_SIZE > 0) newCapacity = hugeCapacity(minCapacity); elementData = Arrays.copyOf(elementData, newCapacity);//扩展空间并复制 } 由于Java GC自动管理了内存,这里也就不需要考虑源数组释放的问题。 空间的问题解决后,插入过程就显得非常简单。 add(int index, E e)需要先对元素进行移动,然后完成插入操作,也就意味着该方法有着线性的时间复杂度。 addAll() addAll()方法能够一次添加多个元素,根据位置不同也有两个把本,一个是在末尾添加的addAll(Collection c)方法,一个是从指定位置开始插入的addAll(int index, Collection c)方法。跟add()方法类似,在插入之前也需要进行空间检查,如果需要则自动扩容;如果从指定位置插入,也会存在移动元素的情况。addAll()的时间复杂度不仅跟插入元素的多少有关,也跟插入的位置相关。 remove() remove()方法也有两个版本,一个是remove(int index)删除指定位置的元素,另一个是remove(Object o)删除第一个满足o.equals(elementData[index])的元素。删除操作是add()操作的逆过程,需要将删除点之后的元素向前移动一个位置。需要注意的是为了让GC起作用,必须显式的为最后一个位置赋null值。 public E remove(int index) { rangeCheck(index); modCount++; E oldValue = elementData(index); int numMoved = size – index – 1; if (numMoved > 0) System.arraycopy(elementData, index+1, elementData, index, numMoved); elementData[–size] = null; //清除该位置的引用,让GC起作用 return oldValue; } 关于Java GC这里需要特别说明一下,有了垃圾收集器并不意味着一定不会有内存泄漏。对象能否被GC的依据是是否还有引用指向它,上面代码中如果不手动赋null值,除非对应的位置被其他元素覆盖,否则原来的对象就一直不会被回收。 原文发布时间为:2018-08-06本文作者:Java杂记本文来自云栖社区合作伙伴“Java杂记”,了解相关信息可以关注“Java杂记”

优秀的个人博客,低调大师

常用命令集合

# dd if=/dev/zero of=/dev/null zero源源不断的产生数据到黑洞null # dd if=/dev/zero of=/data/a.tgz bs=1M count=100 zero产生100M的数据到/data/a.tgz Shift trl T 打开新的终端页面 # echo 123 | passwd --stdin root 开机默认修改root密码 # cat /etc/services | less 查看端口号 # convmv -f GB2312 -t utf8 -r --notest 目录 乱码转换工具convmv # cp /etc/vsftpd/vsftpd.conf{,.bak} 快速备份 # cp /etc/vsftpd/vsftpd.conf{.bak,} 备份覆盖 # yum search elinks // # yum provides "*/elinks" 查询软件包名 # ps aux | grep httpd 查看进程 最小安装rhel图形界面: # yum -y groupinstall "Desktop" "Fort" "General Purpose Desktop" "Input Methods" "X Window System" "Desktop Platform" "Chinese Support" # vim /etc/services 查看默认协议端口 # vim /etc/sysconfig/i18n 修改系统语言 # uuidgen 自动生成UUID # > /etc/udev/rules.d/70-persistent-net.rules #reboot 清空网卡命名规则 # du -sh /opt 查看文件大小 # cat /proc/cpuinfo # top # uptime 查看CPU信息,平均负载 [ -f /var/run/httpd/httpd.pid ] echo $? 判断http服务是否在运行 # /usr/share/doc/* 软件的使用说明目录 # vim /etc/ld.so.conf # ldconfig 系统读取的库文件目录设置 # ab -c 100 -n 1000 http://1.1.1.1/ 模拟100个人访问服务器1000次 # vim /etc/security/limits.conf # ulimit -a 系统内核的一些限制数目, 修改完后需重启reboot # data -d ‘@1421242424’ 时间戳转换 # yum -y groupinstall "X Window System" "Desktop" 安装桌面环境 # cat /etc/redhat-release uname -a 查看系统版本 # yum -y install bash-completion 参数补全 # egrep -v“^$|^#” /etc/login.defs |wc -l 去除#和空行的配置文件 # awk '/[a-z]|^\[/{print}' chrony.conf # awk '!/^#|^$/{i++}END{print i}' chrony.conf # awk '!/#|^$/{print}' conf/nginx.conf # vim /etc/resolv.conf nameserver 114.114.114.114 # for i in * ; do docker load <${i} ; done # for i in `docker images | grep -v REPOSITORY | awk '{print $1}' ` ;do docker push $i;done # doceker rm $(docker ps -aq) # cat >centos.repo <<EOF [CENTOS] Name=centos EOF http://IP:5000/v2/_catalog cp ifcfg-{eth0,br-ex} # curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo # yum -y install epel-release (rpm -ivh http://mirrors.aliyun.com/epel/epel-release-latest-7.noarch.rpm) 阿里云epel源 # yum install -y centos-release-openstack-newton 安装Openstack仓库 # nohup ..... & 放在后台运行 # cat -n /etc/passwd | head -15 | tail -5 打印第11行到15行 # ip add | tee a.txt | grep "inet " 输出到a.txt并打印inet # openssl rand -hex 10 生成随机数

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册