必要な最小限のコードを使用して、apk から外部サービスを開始しようとしています。4.0 AVD でパッケージをテストし、logcat で応答を確認すると、適切な結果が得られるようです。ただし、実際のデバイスではロードされません。実際、logcat にはまったくリストされていないようです。
それはおそらく私が見落としているものであり、確認するために2番目の目が必要なだけです.
StartService.java:
package com.winca.service.start;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
public class StartService extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Intent i = new Intent();
i.setClassName("com.winca.service", "com.winca.service.StartService");
context.startService(i);
}
}
AndroidManifest.xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.winca.service.start"
android:versionCode="13"
android:versionName="1.3" >
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<uses-sdk android:targetSdkVersion="14" android:minSdkVersion="14"/>
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<receiver android:name="com.winca.service.start.StartService">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
</intent-filter>
</receiver>
</application>
</manifest>
AVD 応答:
# getprop ro.build.fingerprint
generic/sdk/generic:4.0.2/ICS_MR0/229537:eng/test-keys
# logcat -c; sleep 1; am broadcast -a android.intent.action.BOOT_COMPLETED; sleep 20; logcat -d | grep winca
Broadcasting: Intent { act=android.intent.action.BOOT_COMPLETED }
Broadcast completed: result=0
W/ActivityManager( 80): Unable to start service Intent { cmp=com.winca.service/.StartService }: not found
#
サービスを含む実際のパッケージが AVD にインストールされていないため、実際には「見つかりません」と予想されます。システムの SharedUserID が原因でインストールできません。しかし、少なくとも、実際のデバイスはlogcatメッセージにリストされていませんが、AVDでロードしようとしていることがわかります。
背景を少し説明すると、サードパーティのランチャーがデフォルトに設定されている場合、この特定の Android デバイスは「com.winca.service/.StartService」サービスをロードしていません。これにより、デバイス上のオーディオ サービスの多くが、アクティブ化されるまで無効のままになるのを防ぐことができます。それで、それを行うための簡単なパッケージを作成するかもしれないと思いました。Tasker のようなものを使用する代わりに (何らかの理由で強制的にこのデバイスを閉じます)。