Android应用程序未在启动时运行

时间:2012-08-03 19:16:27

标签: android eclipse startup boot

我有一个基本的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的特定系统上尝试它时,应用程序中的所有内容都正常工作,除非在启动时启动。有任何想法吗?

我试图消除任何硬件问题的可能性(因为我没有使用商用手机),安装另一个启动时启动的应用程序并确认它确实在启动时启动,它确实显示出来在启动后将应用程序作为缓存进程运行。

我将不胜感激任何帮助。如果您需要任何其他信息,请与我们联系。

1 个答案:

答案 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>