如何使Android应用开机时自动启动

如何使Android应用开机时自动启动,第1张

如果需要在Android开机时自动启动应用程序,可以通过响应androidintentactionBOOT_COMPLETED广播消息来实现, Android系统启动结束时,会发出 androidintentactionBOOT_COMPLETED 消息。 具体步骤如下:

1 定义一个Broadcast Receiver ,比如:BootupReceiver

[java]

public class BootupReceiver extends BroadcastReceiver{

@Override

public void onReceive(Context context, Intent intent) {

//better delay some time

try {

Threadsleep(2000);

} catch (InterruptedException e) {

// TODO Auto-generated catch block

eprintStackTrace();

}

Intent i = new Intent(context, BootupDemoActivityclass);

iaddFlags(IntentFLAG_ACTIVITY_NEW_TASK);

contextstartActivity(i);

}

}

public class BootupReceiver extends BroadcastReceiver{

@Override

public void onReceive(Context context, Intent intent) {

//better delay some time

try {

Threadsleep(2000);

} catch (InterruptedException e) {

// TODO Auto-generated catch block

eprintStackTrace();

}

Intent i = new Intent(context, BootupDemoActivityclass);

iaddFlags(IntentFLAG_ACTIVITY_NEW_TASK);

contextstartActivity(i);

}

}

用于响应androidintentactionBOOT_COMPLETED。

2 在Manifest文件中定义该Broadcast Receiver

<receiver android:name=”BootupReceiver” android:enabled=”true”

android:permission=”androidpermissionRECEIVE_BOOT_COMPLETED”>

<intent-filter>

<action android:name=”androidintentactionBOOT_COMPLETED”></action>

<category android:name=”androidintentcategoryDEFAULT” />

</intent-filter>

</receiver>

3 加上所需权限

<uses-permission android:name=”androidpermissionRECEIVE_BOOT_COMPLETED” />

这些,但手机重启示会自动运行你的应用。 不过此时你的应用可能会被屏幕锁定挡住。解除屏幕锁定后可以看到你运行的应用。

如果想用户一开机就看到你的应用,可以使用代码就屏幕锁去除,方法如下:

1 在Activity的onCreate事件处理中添加下面代码

[java]

KeyguardManager keyguardManager

= (KeyguardManager)getSystemService(KEYGUARD_SERVICE);

KeyguardLock lock = keyguardManagernewKeyguardLock(KEYGUARD_SERVICE);

lockdisableKeyguard();

KeyguardManager keyguardManager

= (KeyguardManager)getSystemService(KEYGUARD_SERVICE);

KeyguardLock lock = keyguardManagernewKeyguardLock(KEYGUARD_SERVICE);

lockdisableKeyguard();

2 在Manifest文件中添加所需权限

<uses-permission android:name=”androidpermissionDISABLE_KEYGUARD” />

使用PermissionsDispatcher进行程序管理,在程序运行过程中,申请权限和拒绝权限都不会出现问题,后来发现,在程序运行过程中,比如进入某个页面,然后点击home键,在设置中,选择该应用,关闭某个权限,再返回该应用,点击back键,会出现闪退的情况,跟踪log,发现是某个字段变成了Null,刚开始以为程序问题,后来调试时发现,在设置修改权限以后,程序进程变成了dead,如图:

在这里插入描述

发现微信的 *** 作方法就是,设置关闭某个权限,就重新启动。

最初的解决办法,是在onResume方法里边,先保存一下现有权限,进入界面以后,再重新获取一下权限,看看有没有改变,如果权限改变,就重新进入启动页,重新获取数据,但是失败了,因为进程已经被杀死了,不会再走onResume方法。

最后的解决办法:在一个Activity的基类的onCreate方法中,判断savedInstanceState是否为null,如果为null,说明是正常启动,如果有数据,就是设置被修改,异常关闭情况下,程序会保存一些数据,所以在有数据的情况下,重新打开启动页。

protected void onCreate(Bundle savedInstanceState)

{

superonCreate(savedInstanceState);

Loge("onCreate","savedInstanceState:"+savedInstanceState);

if(savedInstanceState!=null){

Intent intent=new Intent(UIthis, SplashActivityclass);

intentsetFlags(IntentFLAG_ACTIVITY_NEW_TASK | IntentFLAG_ACTIVITY_CLEAR_TASK);

startActivity(intent);

}

}

1

2

3

4

5

6

7

8

9

10

1

2

3

4

5

6

7

8

9

10

调试结果:

在这里插入描述

savedInstanceState:null是正常启动的情况,savedInstanceState有数据,是修改过权限,返回当前页面的情况,所以根据有没有数据,可以决定是否重新打开启动页。

启动其他APK的Activity方法

有两个app,分别叫做App1和App2。

App1包含两个Activity,分别叫做App1_A和App1_B其中App1_A是入口Activity

也就是App1_A设置intent-filter,action为<action android:name="androidintentactionMAIN" />

App2只有一个Activity,叫做App2_A。

现在在App2_A中通过startActivity启动App1_A是没问题的但是启动App1_B的时候报了fc错误。

logcat如下:

08-03 02:23:44119: WARN/ActivityManager(64): Permission denied: checkComponentPermission() reqUid=10030

08-03 02:23:44119: WARN/ActivityManager(64): Permission Denial: starting Intent { act=androidintentactionVIEW cmp=comhello/activity2 } from ProcessRecord{407c8bc8 665:comfileExplorer/10032} (pid=665, uid=10032) requires null

用法如下:

Intent intent = new Intent();

ComponentName componentName = new ComponentName("comhello","comhelloApp1_A");//这个没问题

//ComponentName componentName = new ComponentName("comhello","comhelloApp1_B");//这个报错

intentsetComponent(componentName);

startActivity(intent);

解决方法:

(1)

通过隐式intent调用方法实现,需要在被调用的activity的manifest文件中添加

<intent-filter>

<action android:name="comexampleprojectSHOW_ACTIVITY" />

<category android:name="androidintentcategoryDEFAULT" />

</intent-filter>

在StartActivity(it)之前,设定该intent对应的action(comexampleprojectSHOW_ACTIVITY)

Intent intent = new Intent();

intentsetAction(action);

intentaddFlags(IntentFLAG_ACTIVITY_NEW_TASK);

contextstartActivity(intent);推荐使用

利用setAction方法启动Activity还有一个好处就是不需要知道包名和Activity类名,只需要知道action就可以隐式的启动activity

(2)

即使直接指定了目标activity的ComponentName,跨应用的activity调用也要至少给目标activity指定一个带action的filter。如:

<intent-filter>

<action android:name="" />

</intent-filter>

action name为空即可。

(3)给被调用的Activity增加一个带action的filter,如下:

<intent-filter>

<action android:name="comsdmcottplayeruercenter" />

</intent-filter>

然后可以通过隐式Intent来调用,而不用使用intentsetComponent方法,如下就OK了(但是经过验证,这种方法只是对APK的入口activity有用,对普通的没用,和上面的问题一样无法解决:启动其他APK的非入口activity)

Intent i = new Intent("comsdmcottplayeruercenter");

isetFlags(IntentFLAG_ACTIVITY_NEW_TASK);

thisstartActivity(intent);

异常处理:

Caused by: androidutilAndroidRuntimeException: Calling startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag Is this really what you want

Context中有一个startActivity方法,Activity继承自Context,重载了startActivity方法。

如果使用 Activity的startActivity方法,不会有任何限制,

而如果使用Context的startActivity方法的话,就需要开启一个新 的task,遇到上面那个异常的,都是因为使用了Context的startActivity方法。

解决办法是,加一个flag。intentaddFlags(IntentFLAG_ACTIVITY_NEW_TASK)

Intent intent = new Intent();

intentsetClass(mContext, VideoPlayerclass);

intentaddFlags(IntentFLAG_ACTIVITY_NEW_TASK);

mContextstartActivity(intent);

Intent intent = new Intent( context,MainActivityclass);

intentsetFlags(IntentFLAG_ACTIVITY_NEW_TASK);

contextstartActivity(intent);

Context 就是上下文,这里不是已经传递进来了,所有控件创建都需要使用Context,Activity Service都是context的子类

以上就是关于如何使Android应用开机时自动启动全部的内容,包括:如何使Android应用开机时自动启动、安卓跳转到设置权限页后返回重启、android 不用startactivity 怎么开启activity的方法等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10627767.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-10
下一篇 2023-05-10

发表评论

登录后才能评论

评论列表(0条)

保存