0

必要な最小限のコードを使用して、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 のようなものを使用する代わりに (何らかの理由で強制的にこのデバイスを閉じます)。

4

2 に答える 2

1

コンポーネントの 1 つが明示的に応答するまで、レシーバーは機能しませんIntent。これが機能する一般的な方法は、ユーザーがアクティビティの 1 つを実行することです。それまでは、Android 3.1 以降では、アプリはマニフェストに登録されたレシーバーがブロードキャストに応答しない「停止状態」になります。

于 2014-01-22T21:34:33.910 に答える
0

アプリを /system/app ディレクトリに移動すると、通常のインストールから「停止状態」が回避されることがわかりました。ユーザーがこの特定の Android デバイス用のカスタム ROM をつなぎ合わせているため、これはとにかく意図したものです。問題は、アプリをインストールしてテストしているため、「停止状態」が発生し、適切に実行されないことです。ただし、正しいファイル権限でアプリを /system/app ディレクトリに移動すると、apk が意図したとおりに動作するようになりました。

これは、Google Play を介してアプリを配布するなど、ほとんどのサードパーティの開発状況では実用的ではないソリューションだと思います。そのためには、CommonsWare で指摘されているように、インストール中にユーザーがインテントを少なくとも 1 回起動できるようにするという規則に従う必要があります。

AVD で実行された理由については、振り返ってみると、Eclipse の [実行] > [デバッグ] (F11) メカニズムを介して最初にインストールしたことに関係があると思われます。「dumpsys package {package.name}」に従って、パッケージを「stopped = false」としてマークする別のインストール方法を使用していると思います。

于 2014-01-23T13:12:16.600 に答える