重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
1、第一阶段:加在首页的PopupWindow上面
十载的湘阴网站建设经验,针对设计、前端、开发、售后、文案、推广等六对一服务,响应快,48小时及时工作处理。成都全网营销的优势是能够根据用户设备显示端的尺寸不同,自动调整湘阴建站的显示方式,使网站能够适用不同显示终端,在浏览器中调整网站的宽度,无论在任何一种浏览器上浏览网站,都能展现优雅布局与设计,从而大程度地提升浏览体验。创新互联从事“湘阴网站设计”,“湘阴网站推广”以来,每个客户项目都认真落实执行。
private void addFeatureGuide() {
LayoutInflater layoutInflater = LayoutInflater.from(this);
LinearLayout popContentView = (LinearLayout) layoutInflater.inflate(R.layout.popup, null);
PopupWindow popupWindow = new PopupWindow(popContentView, LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT);
popupWindow.showAtLocation(this.findViewById(R.id.main_root), Gravity.CENTER, 0, 0);
}
在onResume的时候调用addFeatureGuide()方法。
这样应该OK了吧?不!Run的时候报错了:
FATAL EXCEPTION: main
java.lang.RuntimeException: Unable to resume activity {com.example/com.example.MyActivity}: android.view.WindowManager$BadTokenException: Unable to add window — token null is not valid; is your activity running?
at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3128)
at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3143)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2684)
at android.app.ActivityThread.access$2300(ActivityThread.java:125)
因为需求有做开机引导,所以简单的学习下这块功能的流程,并简单的做个总结
主要参考文章:
做开机引导,主要要做到的效果就是 只有第一次使用的时候会打开,只打开一次,当执行完开机引导的流程之后,之后开机都不会再展示
要实现开机引导,那么就一定是系统应用,按照原理来说,需要两个步骤,第一,需要引导页的优先级比LAUNCHER高。第二,需要流程完毕之后执行某些操作让应用下次不会启动。
可以设置android:priority属性,系统会判断启动priority优先级高的。
这样配置之后,其它应用的优先级如果没有设置的话默认就是0,这样就会优先打开引导页。
自己可以在引导页中写自己想要做的逻辑。当执行完所有逻辑之后,需要配置
这里主要做了设置Settings.Global.DEVICE_PROVISIONED和Settings.Secure.USER_SETUP_COMPLETE两个参数,还有PackageManager.setComponentEnabledSetting方法禁用组件
第一个参数是组件名
第二个参数是状态
不可用状态:COMPONENT_ENABLED_STATE_DISABLED
可用状态:COMPONENT_ENABLED_STATE_ENABLED
默认状态:COMPONENT_ENABLED_STATE_DEFAULT
第三个参数flags
DONT_KILL_APP或者0,0表示杀死包含该组件的app
运行时会发现设置priority优先级比LAUNCHER高,在开机之后也会提示让你选择打开应用,而不是默认打开优先级高的,关于这个问题,可以参考这篇文章
只需要把应用安装到system/priv-app中,就能解决这个问题。正常来说一般系统应用也是安装在这么文件夹中,只是平时调试的时候会为了方便直接run,所以可能出现这个问题。
将应用安装到该文件夹中可以使用这个命令,然后重启
看了很多文章,都没有讲到为什么要设置这两属性,因为要达成目的,我们只需要设置priority和调用setComponentEnabledSetting方法就行,为什么要设置这两个参数?不设置会有什么影响。
其实简单来说,系统在其他地方有用到这两个参数,举个简单的例子,我直接
去运行程序,能够很明显的测出这种情况下按Home键没反应,除此之外屏保也会不显示。
所以这两个参数还是需要在这个地方设为1的。
用NFS作为rootfs来启动内核在开发中的必备的,用nfs启动android,也就免去频繁的对nand烧写操作。网上有很多文章,可惜都是互相copy,参考性不强。下面来说明如何用NFS来启动android,具体的操作就不细说了。通常的嵌入式linux使用NFS启动,需要启动NFS的文件系统和相关网络支持,这是第一步,至少内核在最后阶段能mount到FS,而mount之前网络协议也必须是支持的。
内核启用NFS文件系统支持,网络里面支持IP_PNP下的BOOTP,DHCP,RARP
android内核在最后阶段,是执行RAMDISK中的init进程来remount分区,system和data也是在这个时候才挂载上的。使用NFS启动时,要关闭内核中的ramdisk功能。这样,内核启动后,mount到NFS的目录,然后直接执行NFS目录下的init进程
准备android的文件系统。编译aosp代码,最终生成system, data, root目录,分别copy到NFS目录下,配置NFS允许网络访问该目录。在nfsroot目录下,需要修改init.rc文件。里面会对system重新挂载,可以注释掉该内容,修改如下:
#on fs
# mount mtd partitions
# Mount /system rw first to give the filesystem a chance to save a checkpoint
#mount yaffs2 mtd@system /system
#mount yaffs2 mtd@system /system ro remount
#mount yaffs2 mtd@userdata /data nosuid nodev
#mount yaffs2 mtd@cache /cache nosuid nodev
on post-fs
# once everything is setup, no need to modify /
mount rootfs rootfs / rw remount
这里,关闭也on fs的action操作,记得把on fs也注释掉
Android 手机在刷了 Gapps 之后,在开机进入系统时会进入 Gapps 的开机引导(也就是设置 Google 帐号神马的)。但是这需要连 Google 进行验证,于是。。。。。。。。
对于这种情况,可以通过以下方法解决:
这个方法就不多说了,只要能连上 Google ,就不会卡在这里了。至于怎么连 Google ,请自行寻找科学上网。
这个Gapps的开机引导是需要连网进行的,默认的情况下如果不连网的情况下是会自动跳过的。但是许多系统在默认情况下 Wifi 和数据是会自动打开,就算把卡取了,也还会有 Wifi ,一样无法跳过。对此,可选择先不刷 Gapps ,进入系统后将 Wifi 的数据关闭,再刷 Gapps ,此方法有一定弊端,有可能会导致 Gapps 某些应用发生某些玄学问题。。。。。
在设置时,可点击 复制数据 ,而后拉到最底,点击 离线设置 后再进行一些设置就可进入系统。(但同样玄学的是,有时在 复制数据 里,并没有离线设置或使用本地设置这一选项╮( ̄▽ ̄)╭)
这可能是最玄学的一个方法了,据传连点屏幕四角就可跳过此引导( 顺时针 方向,从左上角开始)。但是!!!但是!!!这是检验血统的时刻,时灵时不灵。别问我是怎么知道的。 (╯‵□′)╯︵┻━┻
敲黑板!!! 这是我所试过最科学的方法。在开机情况下,将手机连上电脑,使用 adb 工具来修改 USER_SETUP_COMPLETE 和 DEVICE_PROVISIONED 的值。具体操作如下:
最后附上测试环境:
PC: Windwos 10
Android: LineageOS 15.0 for Xiaomi Mi 5
Gapps: open_gapps-arm64-8.0-aroma-20171021
adb: 1.0.39