如果需要在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的方法等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)