【问题标题】:Android Application not running at startupAndroid 应用程序在启动时未运行
【发布时间】:2012-08-04 05:57:22
【问题描述】:

我有一个基本的 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 模拟器中,应用程序似乎工作正常。也就是说,虽然我的模拟器没有植根并且手机没有正确执行重启命令,但我确实看到,在启动时,启动了正确的活动。

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

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

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

【问题讨论】:

    标签: android eclipse startup boot


    【解决方案1】:

    这里有很多问题。

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

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

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

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

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

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

    【讨论】:

    • 很抱歉,当我试图拼凑一个解决方案而不知道自己在做什么时,我没有意识到我让它变得多么令人费解。我已经完全删除了 StartupManager,因为它除了启动另一个活动之外什么也没做,而且我还做了一些其他更改,这些更改都反映在 OP 中。这看起来合适吗?还是我需要启动一个服务来启动活动?
    • 另外注意,我在 OP 中发布的新版本不起作用。甚至 startmyserviceatboot 接收器在运行时也没有在日志中发布任何内容。我还看到一条红色控制台消息“未找到启动器活动!”
    • @TSM:“这看起来合适吗?” -- 除非您将StartMyServiceAtBootReceiver 用于其他目的,否则您可以跳过if() 检查。而且那个类现在可能需要一个不同的名字...... :-) 在启动时启动一个活动非常奇怪 - 将你的活动作为主屏幕可能会更好,这意味着你可以转储所有 @987654340 @ 东西。而且,在您的BOOT_COMPLETED 接收者响应之前,您仍然需要用户手动运行活动(或类似的操作)。
    • @TSM:“我还看到一条红色控制台消息“未找到启动器活动!”——确保您正在运行此项目。有时在 Eclipse 中,您不小心运行了一些不同的项目。下面是一个简单的引导接收器示例:github.com/commonsguy/cw-omnibus/tree/master/SystemEvents/…
    • 非常感谢您的帮助。我有另一个问题。至于“您仍然需要用户手动运行活动”部分,您的意思是,在每次重新启动时,我需要让他们这样做吗?我想要完成的是用户第一次打开应用程序,按下一个按钮,让他们连续重启设备 100 次,并让它连续重启手机 100 次而无需手动操作在用户端。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-13
    • 2021-08-23
    • 2015-03-25
    相关资源
    最近更新 更多