2010-10-03 9 views
28

Próbuję autostartu mój wniosek nightclock w sprawie pobierania opłat za pomocą następującego BroadcastReceiver realizowany w OnPause() metoda:startActivity() z BroadcastReceiver

BroadcastReceiver test = new BroadcastReceiver() { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     unregisterReceiver(this); 
     Intent i = new Intent(context, NightClock.class); 
     i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
     context.startActivity(i); 
    }   
}; 
registerReceiver(test, new IntentFilter(Intent.ACTION_POWER_CONNECTED)); 

Sposób onReceive() jest zwolniony, gdy kabel USB jest podłączony, ale działanie nie rozpoczyna się. Jednak dziennik pokazuje:

I/ActivityManager( 79): Starting activity: Intent { flg=0x10000000 cmp=com.meins.nightclock/.NightClock } 

Jakieś pomysły, dlaczego dziennik mówi, że aktywność została rozpoczęta, ale nic się nie dzieje?

+0

Proszę zaktualizować swój problem, więcej z LogCat - kilka linii przed tym i kilkanaście linii po tym. Dlaczego też "FLAG_ACTIVITY_NEW_TASK"? Poza tym, czy aktywność, która zarejestrowała to "BroadcastReceiver", nadal występuje, gdy występuje ACTION_POWER_CONNECTED? – CommonsWare

+0

Po podłączeniu do zasilania nie ma więcej linii w LogCat. 'BroadcastReceiver' jest zarejestrowany w tej samej czynności, którą powinien rozpocząć. Ta aktywność nadal działa w tle (aplikacja LogCat została przeniesiona na wierzch). Jeśli ta aktywność zostanie utracona w menedżerze zadań, 'BroadcastReceiver' nie wydaje się w ogóle uruchamiać. Czy to podejście do automatycznego uruchamiania mojej aplikacji od początku? – Gubbel

Odpowiedz

16

Jeśli chcesz, aby NightClock było uruchamiane za każdym razem, gdy wysyłana jest transmisja ACTION_POWER_CONNECTED, Twoje podejście do korzystania z BroadcastReceiver jest w porządku. Nie rejestruj go jednak w działaniu. Raczej zarejestrować go w manifeście:

<receiver android:name=".OnPowerReceiver"> 
     <intent-filter> 
       <action android:name="android.intent.action.ACTION_POWER_CONNECTED" /> 
     </intent-filter> 
</receiver> 

Następnie mają swój BroadcastReceiver jako klasa publicznych Java (tutaj nazwie OnPowerReceiver, chociaż można nazwać to, co chcesz), i to nazywamy startActivity().

Pamiętaj, że użytkownicy prawdopodobnie nie chcą, abyś to robił. Istnieje wiele innych przypadków podłączenia telefonu do zasilania, oprócz uruchomienia "zegara nocnego". Pokornie sugeruję, abyś po prostu pozwolił użytkownikom rozpocząć działalność na ekranie głównym.

+0

Zarejestrowałem 'BroadcastReceiver' w manifeście, tak jak powiedziałeś w tym wywołaniu, w metodzie' onReceive() ': context.startActivity (new Intent (context, NightClock.class));' Ale nic się nie dzieje, gdy się łączę telefon do zasilania. Nawet wpis dziennika nie jest dodawany, jeśli dodaję 'Log.d (this.toString()," próbuję uruchomić aplikację ... ");' do metody. – Gubbel

+2

@Gubbel: Ups. Wypróbuj ''. Przez większość czasu nie mają w łańcuchu "ACTION_", ale najwyraźniej robią to na tym. – CommonsWare

+0

To działa! Dziękuję Ci. – Gubbel

46

Masz kontekst przekazany jako parametr do onRecieve metoda(), więc wystarczy użyć:

@Override 
public void onReceive(Context context, Intent intent) { 
    //start activity 
    Intent i = new Intent(); 
    i.setClassName("com.test", "com.test.MainActivity"); 
    i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
    context.startActivity(i); 
} 

To działa, oczywiście trzeba zmienić pakiet i nazwę klasy aktywności na własną rękę.

+2

Dlaczego spadamy? Czy to źle? Pomogło mi to +1, ponieważ nie mogłem znaleźć nic, co by sugerowało, że to złe podejście. – Mafro34

+0

@ Mafro34 Po prostu próbowałem tego samego podejścia i powodem, dla którego uważam, że nie jest idealny jest flaga, którą on ustawia. Bo o ile nie jest to tym, czego chcesz (uruchamianie nowego zadania), może to poważnie naruszyć twoją logikę aplikacji - tak czy owak z moim. Więc jeśli tego nie chcesz, zalecam znalezienie innego podejścia. – AgentKnopf

+5

@AgentKnopf Wygląda na to, że nie masz dużego wyboru: (od http://developer.android.com/reference/android/content/Context.html#startActivity%28android.content.Intent,%20android.os.Bundle % 29): "Należy zwrócić uwagę, że jeśli ta metoda jest wywoływana spoza kontekstu działania, to intent musi zawierać flagę uruchamiania FLAG_ACTIVITY_NEW_TASK, ponieważ, bez uruchamiania z istniejącej aktywności, nie istnieje żadne zadanie, w którym aby umieścić nową działalność, a tym samym należy ją umieścić w odrębnym zadaniu. " – aberaud

-3

Od Docs:

Nie rozpocząć działalność od odbiorników, ponieważ doświadczenie użytkownik wstrząsów; zwłaszcza jeśli jest więcej niż jeden odbiornik. Zamiast tego rozważ wyświetlenie powiadomienia.

+0

Zastępują to w wielu domyślnych aplikacjach, takich jak alarmy i połączenia przychodzące. Tak więc, jeśli użytkownik tego chce, jest to jego wezwanie. Twoja odpowiedź nie odpowiada na pytanie. – Dpedrinha

Powiązane problemy