2012-03-13 8 views
3

Я реализовал широковещательный приемник:BroadcastReceiver не работает

public class ServiceManager extends BroadcastReceiver { 
    private final String BOOT_ACTION = "android.intent.action.BOOT_COMPLETED"; 
    private final String BOOT_ACTION_FIRST_LAUNCH = "android.intent.action.PACKAGE_FIRST_LAUNCH"; 
    private final String BOOT_ACTION_RESTARTED = "android.intent.action.PACKAGE_RESTARTED"; 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     // All registered broadcasts are received by this 
     String action = intent.getAction(); 
     if (action.equalsIgnoreCase(BOOT_ACTION) || action.equalsIgnoreCase(BOOT_ACTION_FIRST_LAUNCH) || 
       action.equalsIgnoreCase(BOOT_ACTION_RESTARTED)) { 
      // TODO: Action 
     } 
    } 

} 

AndroidManifest.xml

<receiver android:name="package.service.ServiceManager" > 
    <intent-filter> 
     <action android:name="android.intent.action.BOOT_COMPLETED" /> 
     <action android:name="android.intent.action.PACKAGE_FIRST_LAUNCH" /> 
     <action android:name="android.intent.action.PACKAGE_RESTARTED" /> 
    </intent-filter> 
</receiver> 

Действие BOOT_COMPLETED работает правильно, но, в PACKAGE_FIRST_LAUNCH и PACKAGE_RESTARTED не работают. Мне нужно запустить свой широковещательный приемник при запуске приложения, поэтому я использую эти действия. Но когда я запускаю или перезапускаю приложение, приемник не работает. Он работает только при перезагрузке моего мобильного телефона. Что-то не так в моем источнике?

+1

Как правило: использование строковых констант - это хорошо. В случае строк действия намерения, вы не должны делать это самостоятельно, хотя. Все эти строки имеют свою собственную константу в рамках андроида, большинство из них принадлежат классу Intent. Например. см. ['Intent.ACTION_BOOT_COMPLETED'] (http://developer.android.com/reference/android/content/Intent.html#ACTION_BOOT_COMPLETED). Скорее используйте их, избегая путаницы из-за случайной опечатки при определении их самостоятельно. ;) –

ответ

3

Похоже, что PACKAGE_FIRST_LAUNCH будет транслироваться после того, как приложение будет запущено в первый раз после загрузки/перезагрузки. И PACKAGE_RESTARTED должен быть транслирован, если ваш стек активности приложения удален, а затем ваше приложение будет нажата, чтобы начать заново (например, перезапустить).

Однако вы можете просто достичь этого путем трансляции пользовательской строки действий, когда вы запускаете свое приложение (возможно, от вашего первого действия).

5

FYI: PACKAGE_FIRST_LAUNCHтолько отправлен в пакет установщика, то есть то, что вы использовали для установки приложения - для большинства конечных пользователей, которые будут Android Market.

Edit:
О, и для «PACKAGE_RESTARTED», ломают, что один из в свои <intent-filter> и добавить

<data android:scheme="package"/> 

так, что один приходит с URI и явной схемы.

0

Manifest:

... 
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"></> 
... 
<receiver android:name=".AutoStart"> 
    <intent-filter> 
     <action android:name="android.intent.action.BOOT_COMPLETED"></action> 
    </intent-filter> 
</receiver> 
... 

Приемник:

package YourPackage; 
import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 

public class AutoStart extends BroadcastReceiver 
{ 
    @Override 
    public void onReceive(Context context, Intent intent) 
    { 
     if (intent.getAction().equals("android.intent.action.BOOT_COMPLETED")) 
     { 
      // Your code 
     } 
    } 
} 
0

Намерение android.intent.action.PACKAGE_FIRST_LAUNCH вводится в Android API Level 12. Если вы используете меньший уровень API не будет работать. Поэтому соответствующим образом измените настройки проекта.