我有一个基本的Android应用程序应该连续重启手机一定次数。为了做到这一点,我需要在手机启动时启动应用程序。为此,我基本上遵循找到的here指令,向清单添加权限并创建启动活动的BroadcastReceiver类。以下是我的一些相关代码:
public class StartMyServiceAtBootReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
System.out.println("StartMyServiceAtBootReceiver called.");
if ("android.intent.action.BOOT_COMPLETED".equals(intent.getAction())) {
// Intent activityIntent = new Intent("com.example.rebooter.MainActivity");
Intent activityIntent = new Intent(context,MainActivity.class);
activityIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(activityIntent);
}
}
}
从清单文件中:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.rebooter"
android:versionCode="1"
android:versionName="1.0" >
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="15" />
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".MainActivity"
android:label="@string/title_activity_main" >
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</activity>
<service
android:name=".RebootManager"
android:label="Reboot Manager" >
<action android:name="com.example.rebooter.RebootManager" />
</service>
<receiver android:name=".StartMyServiceAtBootReceiver"
android:enabled="true"
android:exported="true"
android:label="StartMyServiceAtBootReceiver" >
<action android:name="android.intent.action.BOOT_COMPLETED" />
</receiver>
</application>
在Eclipse模拟器中,应用程序似乎正常工作。也就是说,虽然我的模拟器没有root,并且手机没有正确执行重启命令,但我确实看到,启动时会启动正确的活动。
现在,当我在运行Android 4.0.4的特定系统上尝试它时,应用程序中的所有内容都正常工作,除非在启动时启动。有任何想法吗?
我试图消除任何硬件问题的可能性(因为我没有使用商用手机),安装另一个启动时启动的应用程序并确认它确实在启动时启动,它确实显示出来在启动后将应用程序作为缓存进程运行。
我将不胜感激任何帮助。如果您需要任何其他信息,请与我们联系。
答案 0 :(得分:1)
这里有很多问题。
首先,您忽略了发布StartMyServiceAtBootReceiver
,即您希望在启动时获得控制权的组件,因此我们无法评论它是否存在任何特定问题。
其次,除非某些内容明确执行了您的某个组件(例如,用户从主屏幕启动了MainActivity
),否则永远不会在Android 3.1+上调用StartMyServiceAtBootReceiver
。确保在尝试重新启动之前运行您的活动,看看是否有帮助。
第三,你在StartupManager
上实现了一个构造函数,这是一个坏主意。请将此逻辑移至onCreate()
。
第四,您的代码可能会在该构造函数中崩溃,因为getApplication()
在代码中此时不会返回有效值,特别是因为您无法链接到超类的构造函数。同样,将此代码移至onCreate()
将有助于此。
第五,从服务的onCreate()
开始活动(更不用说它的构造函数)是非常不寻常的,用户可能不会理解。此外,如果该服务没有执行任何其他操作,您可以轻松地从StartMyServiceAtBootReceiver
启动该活动并完全跳过StartupManager
。
第六,您的服务上有<intent-filter>
个元素,就好像您希望第三方开发人员调用这些服务一样。如果是这样的话,那很好。如果没有,请删除<intent-filter>
元素,并在其余的应用代码中使用明确的Intents
来引用它们(例如new Intent(this, StartupManager.class)
),以提高安全性。或者,将android:exported="false"
添加到这些服务,但如果删除<intent-filter>
元素,则会自动添加。{/ p>