web-dev-qa-db-fra.com

Android adb Shell am broadcast: nom de composant incorrect

J'essaie "d'émuler" un redémarrage (ou autre chose avec le adb Shell am) et je ne sais pas comment référencer mon composant. Là encore, peut-être que je ne comprends même pas ce que l'on entend par composant. Ci-dessous, j'inclus d'abord quelques exemples de commandes qui ne fonctionnent pas, puis mon manifeste. Notez que StartupReceiver est appelé avec succès lorsque le "téléphone" démarre. Je veux juste le relancer sans redémarrage complet.

Commandes ADB ayant échoué:

$ ./adb Shell am broadcast -a Android.intent.action.BOOT_COMPLETED -c Android.intent.category.HOME -n net.fstab.checkit_Android.StartupReceiver
<help snipped>
Error: Bad component name: net.fstab.checkit_Android.StartupReceiver

$ ./adb Shell am broadcast -a Android.intent.action.BOOT_COMPLETED -c Android.intent.category.HOME -n .StartupReceiver
<help snipped>
Error: Bad component name: .StartupReceiver

$ ./adb Shell am broadcast -a Android.intent.action.BOOT_COMPLETED -c Android.intent.category.HOME -n StartupReceiver
<help snipped>
Error: Bad component name: StartupReceiver

Manifeste:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:Android="http://schemas.Android.com/apk/res/Android"
    package="net.fstab.checkit_Android" Android:installLocation="internalOnly"
    Android:versionCode="1" Android:versionName="1.0">
    <application Android:icon="@drawable/icon"
        Android:label="@string/app_name">
        <activity Android:name=".BaseActivity" Android:label="@string/app_name">
            <intent-filter>
                <action Android:name="Android.intent.action.MAIN" />
                <category Android:name="Android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <activity Android:name="BasePreferences" />
        <activity Android:name="EditActivity" />

        <receiver Android:name="StartupReceiver">
            <intent-filter>
                <action Android:name="Android.intent.action.BOOT_COMPLETED" />
                <category Android:name="Android.intent.category.HOME" />
            </intent-filter>
        </receiver>

        <receiver Android:name="NotificationReceiver">
            <intent-filter>
                <action Android:name="net.fstab.checkit_Android.NotificationReceiver" />
            </intent-filter>
        </receiver>

        <service Android:name="StartupService">
            <intent-filter>
                <action Android:name="net.fstab.checkit_Android.StartupService" />
            </intent-filter>
        </service>
    </application>
    <uses-sdk Android:minSdkVersion="8" />

    <uses-permission Android:name="Android.permission.RECEIVE_BOOT_COMPLETED" />
</manifest>
44
altendky

Vous devez spécifier le nom du package avant le nom de la classe (vous pouvez alors l'écrire sans le package) comme ceci:

./adb Shell am broadcast -a Android.intent.action.BOOT_COMPLETED -c Android.intent.category.HOME -n net.fstab.checkit_Android/.StartupReceiver

En pratique, il s'avère que vous n'avez qu'à ajouter une barre oblique après le nom du package.

Tu m'as aidé à commencer, je t'ai aidé à finir :)

79
lapis

La diffusion ne nécessite pas de spécifier de récepteur. Ce cas, s'il vous plaît juste caresser

adb Shell am broadcast -a Android.intent.action.BOOT_COMPLETED

J'espère que cette aide.

60
Viet

Certaines applications peuvent se comporter mal si BOOT_COMPLETED est reçu deux fois, au lieu de cela, limiter la diffusion à votre application uniquement:

adb Shell am broadcast -a Android.intent.action.BOOT_COMPLETED -p com.example.package
10
ejboy

Essayer

adb Shell am broadcast \ -a Android.intent.action.BOOT_COMPLETED \ -n net.fstab.checkit_Android/.StartupReceiver

(notez le - n net.fstab.checkit_Android/.StartupReceiver) pour viser un récepteur spécifique.

Assurez-vous également que votre application utilise l'autorisation de recevoir des intentions de diffusion spécifiques - dans ce cas, il serait

<uses-permission Android:name="Android.permission.RECEIVE_BOOT_COMPLETED" />

2
foo