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まず、起動時に制御を取得することを期待しているコンポーネントであるを投稿することを怠ったため、特定の問題があるかどうかについてコメントすることはできません。

次に、 Android 3.1 以降では、何かがコンポーネントの 1 つを明示的に実行しない限り (たとえば、ユーザーがMainActivityホーム画面から起動した場合)、コンポーネントが呼び出されることはありません。StartMyServiceAtBootReceiver再起動を試みる前に必ずアクティビティを実行し、それが役立つかどうかを確認してください。

3 番目に、 にコンストラクターを実装しましたがStartupManager、これは悪い考えです。このロジックを に移動してくださいonCreate()

getApplication()第 4 に、特にスーパークラスのコンストラクターへのチェーンに失敗したため、コードのこの時点で有効な値が返されないため、そのコンストラクターでコードがクラッシュする可能性があります。繰り返しますが、このコードを に移動するonCreate()と、ここで役立ちます。

onCreate()第 5 に、サービス (コンストラクターは言うまでもなく)からアクティビティを開始することは非常に珍しいことであり、ユーザーに理解されない可能性があります。さらに、そのサービスが他に何もしていない場合は、同じように簡単にそのアクティビティを開始して完全StartMyServiceAtBootReceiverにスキップすることができます。StartupManager

第 6 に、<intent-filter>サードパーティの開発者がそれらのサービスを呼び出すことを期待しているかのように、サービスに要素があります。その場合は、大丈夫です。そうでない場合は、要素を削除し、アプリ コードの残りの部分で<intent-filter>明示的に使用してそれらを参照してください (例: )。これにより、セキュリティが強化されます。または、これらのサービスに追加しますが、要素を削除すると自動的に追加されます。Intentsnew Intent(this, StartupManager.class)android:exported="false"<intent-filter>

于 2012-08-03T19:45:28.517 に答える