1

我有一个基本的 Android 应用程序,它应该连续重启手机一定次数。为此,我需要在手机启动时启动应用程序。为此,我基本上按照此处的说明进行操作,将权限添加到清单并创建一个启动活动的 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 模拟器中,应用程序似乎工作正常。也就是说,虽然我的模拟器没有植根并且手机没有正确执行重启命令,但我确实看到,在启动时,正确的活动开始了。

现在,当我在运行 Android 4.0.4 的特定系统上尝试它时,应用程序中的所有内容都正常工作,除了启动时启动。有任何想法吗?

我试图通过安装另一个在启动时启动的应用程序并确认它确实在启动时启动,并且它确实出现在正在运行的应用程序下,从而消除了任何硬件问题的可能性(因为我没有使用商业发布的手机)作为启动后的缓存进程。

我将不胜感激任何帮助。如果您需要任何其他信息,请告诉我。

4

1 回答 1

1

这里有很多问题。

首先,您忽略了发布StartMyServiceAtBootReceiver您希望在启动时获得控制的组件,因此我们无法评论它是否存在任何特殊问题。

其次,除非某些东西已明确执行了您的组件之一(例如,MainActivity从主屏幕启动的用户),StartMyServiceAtBootReceiver否则在 Android 3.1+ 上将永远不会被调用。确保在尝试重新启动之前运行您的活动,看看是否有帮助。

第三,您在 上实现了一个构造函数StartupManager,这是一个坏主意。请将此逻辑移至onCreate().

第四,您的代码可能会在该构造函数中崩溃,因为getApplication()此时代码中不会返回有效值,特别是因为您未能链接到超类的构造函数。同样,将此代码移至onCreate()此处将有所帮助。

第五,从onCreate()服务(更不用说它的构造函数)开始一个活动是非常不寻常的,并且可能不会被用户理解。此外,如果该服务没有做任何其他事情,您可以轻松地从该活动开始StartMyServiceAtBootReceiver并完全跳过StartupManager

第六,您<intent-filter>的服务中有元素,就好像您期望第三方开发人员调用这些服务一样。如果是这样的话,很好。如果没有,请删除这些<intent-filter>元素并Intents在您的应用程序代码的其余部分中使用显式引用它们(例如,new Intent(this, StartupManager.class)),以获得更好的安全性。或者,添加android:exported="false"到这些服务中,尽管如果您删除<intent-filter>元素,这是自动的。

于 2012-08-03T19:45:28.517 回答