Android4.2.2启动向导Provision(SetupWizard)的问题请教

JaydenZhou 2013-10-29 10:28:17
参考了以下的文章,发现是开机第一次会调用Provision.apk来启动设置向导,所以我想在里面加入自己定制的东西,但是我现在遇到了一个棘手的问题:因为它只会在第一次初始化的时候才会调用,那如何让Provision.apk开机时候重复调用呢?比如设置完SetupWizard后,弹出一个对话框“下次不再显示?”,如果还想让Provision.apk还继续开机出现的话如何设置呢? 是否需要更改标志位??
我有JB的源码,Provision的源码路径在:JB\packages\apps\Provision 里面,哪位大神能给点指导呢? 非常感谢!

http://blog.csdn.net/thl789/article/details/7803439
...全文
4400 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
redstart1 2016-01-07
  • 打赏
  • 举报
回复
这个我觉得可以再init.rc里面做一个配置,每次启动的时候,启用这个组件 启用的命令pm enable com.android.provision/.DefaultActivity 这样是不是更合理捏
iverson_wang 2015-09-23
  • 打赏
  • 举报
回复
哥们 开机向导能分享一下吗 我也要做类似de功能 30507244@qq.com
JaydenZhou 2015-09-21
  • 打赏
  • 举报
回复
引用 12 楼 fengyehua 的回复:
我是这样搞的,退出的时候COMPONENT_ENABLED_STATE_DISABLED,在关机的时候收到关机广播后 这样处理, PackageManager pm = context.getPackageManager(); ComponentName name = new ComponentName("com.android.provision", "com.android.provision.DefaultActivity"); pm.setComponentEnabledSetting(name, PackageManager.COMPONENT_ENABLED_STATE_ENABLED , PackageManager.DONT_KILL_APP); 让它COMPONENT_ENABLED_STATE_ENABLED 下次开机不就启动了么!不会出现你说的按home调用Provision.apk了!
多谢,这种思路很好哈`~ 不过如果直接断电的话,就不会走这个关机流程了(我忘记说我是弄AndroidTV的)。 我最后的解法是: 采用文件保存值的形式,当时用了sqlite + contentprovider. 1. 参考Provision源码自己开发一个带有注册功能的开机向导apk. 2. 如果下次或者哪几次后需要重新弹出来,则记录一个标志位到数据库里面,刚好到那个次数的话,就在SystemServer.java里面 重新enable以下Provisivion这个组件。
JaydenZhou 2015-09-21
  • 打赏
  • 举报
回复
引用 9 楼 SessionShow 的回复:
去掉Provision.apk,让 SetupWizard.apk直接调用launcher
有道理,当时也是这么做的。
fengyehua 2015-04-02
  • 打赏
  • 举报
回复
我是这样搞的,退出的时候COMPONENT_ENABLED_STATE_DISABLED,在关机的时候收到关机广播后 这样处理, PackageManager pm = context.getPackageManager(); ComponentName name = new ComponentName("com.android.provision", "com.android.provision.DefaultActivity"); pm.setComponentEnabledSetting(name, PackageManager.COMPONENT_ENABLED_STATE_ENABLED , PackageManager.DONT_KILL_APP); 让它COMPONENT_ENABLED_STATE_ENABLED 下次开机不就启动了么!不会出现你说的按home调用Provision.apk了!
fengyehua 2015-04-02
  • 打赏
  • 举报
回复
这个问题还是没有好的方案吗?
liuweilong1 2014-09-17
  • 打赏
  • 举报
回复
你有 Android4.2.2启动向导 的源码吗
SessionShow 2013-12-24
  • 打赏
  • 举报
回复
去掉Provision.apk,让 SetupWizard.apk直接调用launcher
wch18956441322 2013-10-30
  • 打赏
  • 举报
回复
引用 5 楼 jjzhoujun2010 的回复:
[quote=引用 3 楼 wch18956441322 的回复:] [quote=引用 2 楼 jjzhoujun2010 的回复:] [quote=引用 1 楼 wch18956441322 的回复:] 找一下为什么不出现了,如果有个flag把去了应该就会每次都会调用了,没有仔细看过Provision的源码;
对应的源码里面执行第一次后,设置它不可用的代码是下面这些: // remove this activity from the package manager. PackageManager pm = getPackageManager(); ComponentName name = new ComponentName(this, DefaultActivity.class); pm.setComponentEnabledSetting(name, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP); 然后我试着把pm.setComponentEnabledSetting(name, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP); 中的COMPONENT_ENABLED_STATE_DISABLED 改成COMPONENT_ENABLED_STATE_ENABLE, 出现的情况是不断地调用provision.apk来执行,但是确进不去首页,具体原因我不清楚,能够指导下么?谢谢。 [/quote] remove this activity from the package manager. 这句话说明第一次以后把这个package的信息从packageManager中移除了,你只要不要他移除掉就行了,具体的我也没法帮你看和调试,你自己跟踪packageManagerService里面看看。还有除了那两个状态,还有一个吧?你试试那个!
switch (newState) {
                case COMPONENT_ENABLED_STATE_ENABLED:
                    if (!pkgSetting.enableComponentLPw(className, userId)) {
                        return;
                    }
                    break;
                case COMPONENT_ENABLED_STATE_DISABLED:
                    if (!pkgSetting.disableComponentLPw(className, userId)) {
                        return;
                    }
                    break;
                case COMPONENT_ENABLED_STATE_DEFAULT:
                    if (!pkgSetting.restoreComponentLPw(className, userId)) {
                        return;
                    }
                    break;
                default:
                    Slog.e(TAG, "Invalid new component state: " + newState);
                    return;
[/quote] 我也试过使用Default的默认标志位了,效果跟使用Enabled是一样的,就会不停地调用Provision.apk里面的代码执行,从而进不去桌面。[/quote] 现在也没时间帮你看,应该不是很难修改的;
JaydenZhou 2013-10-30
  • 打赏
  • 举报
回复
引用 7 楼 wch18956441322 的回复:
[quote=引用 5 楼 jjzhoujun2010 的回复:] [quote=引用 3 楼 wch18956441322 的回复:] [quote=引用 2 楼 jjzhoujun2010 的回复:] [quote=引用 1 楼 wch18956441322 的回复:] 找一下为什么不出现了,如果有个flag把去了应该就会每次都会调用了,没有仔细看过Provision的源码;
对应的源码里面执行第一次后,设置它不可用的代码是下面这些: // remove this activity from the package manager. PackageManager pm = getPackageManager(); ComponentName name = new ComponentName(this, DefaultActivity.class); pm.setComponentEnabledSetting(name, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP); 然后我试着把pm.setComponentEnabledSetting(name, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP); 中的COMPONENT_ENABLED_STATE_DISABLED 改成COMPONENT_ENABLED_STATE_ENABLE, 出现的情况是不断地调用provision.apk来执行,但是确进不去首页,具体原因我不清楚,能够指导下么?谢谢。 [/quote] remove this activity from the package manager. 这句话说明第一次以后把这个package的信息从packageManager中移除了,你只要不要他移除掉就行了,具体的我也没法帮你看和调试,你自己跟踪packageManagerService里面看看。还有除了那两个状态,还有一个吧?你试试那个!
switch (newState) {
                case COMPONENT_ENABLED_STATE_ENABLED:
                    if (!pkgSetting.enableComponentLPw(className, userId)) {
                        return;
                    }
                    break;
                case COMPONENT_ENABLED_STATE_DISABLED:
                    if (!pkgSetting.disableComponentLPw(className, userId)) {
                        return;
                    }
                    break;
                case COMPONENT_ENABLED_STATE_DEFAULT:
                    if (!pkgSetting.restoreComponentLPw(className, userId)) {
                        return;
                    }
                    break;
                default:
                    Slog.e(TAG, "Invalid new component state: " + newState);
                    return;
[/quote] 我也试过使用Default的默认标志位了,效果跟使用Enabled是一样的,就会不停地调用Provision.apk里面的代码执行,从而进不去桌面。[/quote] 现在也没时间帮你看,应该不是很难修改的;[/quote] 我现在明白为什么改成COMPONENT_ENABLED_STATE_ENABLED的时候它会不停地调用的了,因为它的xml文件里面描述下面几行: <intent-filter android:priority="1"> --- 优先级比Launcher还高 <category android:name="android.intent.category.HOME"/> --- 第一个启动的HOME程序,以及相应HOME键。 所以,如果是ENABLED的话,点击“返回”按键或者“HOME”键都无法使之退出来。然后我又尝试了另外的一种方法,就是Provision.apk里面还是Disabled,但是在起来Launcher后打开其他APK来利用pm enable com.android.provision/.DefaultActivity的linux命令来使能Provision,使之下次开机可以继续调用(确实可以调用),但是出现的问题是:此时点击“HOME”按键,就会立刻调用Provision.apk了,但这并不是我想要的结果,此刻我又再一次卡在这里了。。。。。 望高手指点指点,谢谢。
wch18956441322 2013-10-29
  • 打赏
  • 举报
回复
找一下为什么不出现了,如果有个flag把去了应该就会每次都会调用了,没有仔细看过Provision的源码;
JaydenZhou 2013-10-29
  • 打赏
  • 举报
回复
引用 4 楼 shadow_dance 的回复:
必杀技: Settings.Secure.putInt(getContentResolver(), Settings.Secure.DEVICE_PROVISIONED, 1);//注掉这句话。 然后reboot。
不行,注掉依然下面还是Disabled,所以还是只能开机执行一次,而且注掉的话机器没有Provisioned的话,后续可能会有其他问题出现。
JaydenZhou 2013-10-29
  • 打赏
  • 举报
回复
引用 3 楼 wch18956441322 的回复:
[quote=引用 2 楼 jjzhoujun2010 的回复:] [quote=引用 1 楼 wch18956441322 的回复:] 找一下为什么不出现了,如果有个flag把去了应该就会每次都会调用了,没有仔细看过Provision的源码;
对应的源码里面执行第一次后,设置它不可用的代码是下面这些: // remove this activity from the package manager. PackageManager pm = getPackageManager(); ComponentName name = new ComponentName(this, DefaultActivity.class); pm.setComponentEnabledSetting(name, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP); 然后我试着把pm.setComponentEnabledSetting(name, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP); 中的COMPONENT_ENABLED_STATE_DISABLED 改成COMPONENT_ENABLED_STATE_ENABLE, 出现的情况是不断地调用provision.apk来执行,但是确进不去首页,具体原因我不清楚,能够指导下么?谢谢。 [/quote] remove this activity from the package manager. 这句话说明第一次以后把这个package的信息从packageManager中移除了,你只要不要他移除掉就行了,具体的我也没法帮你看和调试,你自己跟踪packageManagerService里面看看。还有除了那两个状态,还有一个吧?你试试那个!
switch (newState) {
                case COMPONENT_ENABLED_STATE_ENABLED:
                    if (!pkgSetting.enableComponentLPw(className, userId)) {
                        return;
                    }
                    break;
                case COMPONENT_ENABLED_STATE_DISABLED:
                    if (!pkgSetting.disableComponentLPw(className, userId)) {
                        return;
                    }
                    break;
                case COMPONENT_ENABLED_STATE_DEFAULT:
                    if (!pkgSetting.restoreComponentLPw(className, userId)) {
                        return;
                    }
                    break;
                default:
                    Slog.e(TAG, "Invalid new component state: " + newState);
                    return;
[/quote] 我也试过使用Default的默认标志位了,效果跟使用Enabled是一样的,就会不停地调用Provision.apk里面的代码执行,从而进不去桌面。
有梦想的胖子 2013-10-29
  • 打赏
  • 举报
回复
必杀技: Settings.Secure.putInt(getContentResolver(), Settings.Secure.DEVICE_PROVISIONED, 1);//注掉这句话。 然后reboot。
wch18956441322 2013-10-29
  • 打赏
  • 举报
回复
引用 2 楼 jjzhoujun2010 的回复:
[quote=引用 1 楼 wch18956441322 的回复:] 找一下为什么不出现了,如果有个flag把去了应该就会每次都会调用了,没有仔细看过Provision的源码;
对应的源码里面执行第一次后,设置它不可用的代码是下面这些: // remove this activity from the package manager. PackageManager pm = getPackageManager(); ComponentName name = new ComponentName(this, DefaultActivity.class); pm.setComponentEnabledSetting(name, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP); 然后我试着把pm.setComponentEnabledSetting(name, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP); 中的COMPONENT_ENABLED_STATE_DISABLED 改成COMPONENT_ENABLED_STATE_ENABLE, 出现的情况是不断地调用provision.apk来执行,但是确进不去首页,具体原因我不清楚,能够指导下么?谢谢。 [/quote] remove this activity from the package manager. 这句话说明第一次以后把这个package的信息从packageManager中移除了,你只要不要他移除掉就行了,具体的我也没法帮你看和调试,你自己跟踪packageManagerService里面看看。还有除了那两个状态,还有一个吧?你试试那个!
switch (newState) {
                case COMPONENT_ENABLED_STATE_ENABLED:
                    if (!pkgSetting.enableComponentLPw(className, userId)) {
                        return;
                    }
                    break;
                case COMPONENT_ENABLED_STATE_DISABLED:
                    if (!pkgSetting.disableComponentLPw(className, userId)) {
                        return;
                    }
                    break;
                case COMPONENT_ENABLED_STATE_DEFAULT:
                    if (!pkgSetting.restoreComponentLPw(className, userId)) {
                        return;
                    }
                    break;
                default:
                    Slog.e(TAG, "Invalid new component state: " + newState);
                    return;
JaydenZhou 2013-10-29
  • 打赏
  • 举报
回复
引用 1 楼 wch18956441322 的回复:
找一下为什么不出现了,如果有个flag把去了应该就会每次都会调用了,没有仔细看过Provision的源码;
对应的源码里面执行第一次后,设置它不可用的代码是下面这些: // remove this activity from the package manager. PackageManager pm = getPackageManager(); ComponentName name = new ComponentName(this, DefaultActivity.class); pm.setComponentEnabledSetting(name, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP); 然后我试着把pm.setComponentEnabledSetting(name, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP); 中的COMPONENT_ENABLED_STATE_DISABLED 改成COMPONENT_ENABLED_STATE_ENABLE, 出现的情况是不断地调用provision.apk来执行,但是确进不去首页,具体原因我不清楚,能够指导下么?谢谢。

80,350

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧