Używam AlarmManager
do uruchomienia zamiaru, który nadaje sygnał. Oto mój kod:
AlarmManager mgr = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
Intent i = new Intent(this, Wakeup.class);
try
{
PendingIntent pi = PendingIntent.getBroadcast(this, 0, i, 0);
Long elapsed += // sleep time;
mgr.set(AlarmManager.RTC_WAKEUP, elapsed, pi);
}
catch(Exception r)
{
Log.v(TAG, "RunTimeException: " + r);
}
Dzwonię do tego kodu z Activity
, więc nie wiem, jak mogę otrzymać następujący błąd ...
ERROR/AndroidRuntime(7557): java.lang.RuntimeException: Unable to start receiver com.wcc.Wakeup: android.util.AndroidRuntimeException: Calling startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?
W przypadku wielu wystąpień tego samego działania użyj następującego fragmentu,
Uwaga : tego fragmentu używam poza moim
Activity
. Upewnij się, że TwójAndroidManifest
plik nie zawieraandroid:launchMode="singleTop|singleInstance"
. w razie potrzeby możesz to zmienić naandroid:launchMode="standard"
.To działa dobrze dla mnie. Mam nadzieję, że to komuś oszczędza czas. Jeśli ktoś znajdzie lepszy sposób, podziel się z nami.
źródło
Dokument Android mówi:
Oznacza to,
(Build.VERSION.SDK_INT <= Build.VERSION_CODES.M) || (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P)
że dodawanie jest obowiązkoweIntent.FLAG_ACTIVITY_NEW_TASK
podczas dzwonieniastartActivity()
spozaActivity
kontekstu.Lepiej więc dodać flagę dla wszystkich wersji -
źródło
Nie wkleiłeś części, do której dzwonisz
startActivity
, to interesująca część.Możesz dzwonić
startActivity
wService
kontekście lub wApplication
kontekście.Wydrukuj „to”, aby zalogować kota przed nawiązaniem
startActivity
połączenia, i zobacz, do czego się odnosi, czasami chodzi o przypadkowe użycie wewnętrznego „tego”.źródło
Czasami ten błąd może wystąpić bez wyraźnego wezwania do
startActivity(...)
. Na przykład niektórzy z was mogli zobaczyć ślad stosu w Crashlytics:Możesz się zastanawiać, co zrobiłeś źle, ponieważ śledzenie zawiera tylko kod frameworka. Oto przykład, jak to się może stać. Powiedzmy, że jesteśmy fragmentem.
Teraz, gdy użytkownik kliknie ten widok tekstu, aplikacja zawiesi się ze śladem stosu powyżej. Wynika to z faktu, że inflator układu ma odniesienie do kontekstu aplikacji , a zatem widok tekstu ma kontekst aplikacji. Kliknięcie tego widoku tekstowego wywołuje niejawnie
appContext.startActivity(...)
.Ostatnia uwaga: przetestowałem to na urządzeniach z Androidem 4, 5, 6 i 7. Wpływa tylko na 4, 5 i 6. Urządzenia z Androidem 7 najwyraźniej nie mają problemów z połączeniem
appContext.startActivity(...)
.Mam nadzieję, że to pomaga komuś innemu!
źródło
Ten sam błąd, z jakim się spotkałem w przypadku otrzymania Powiadomienia w najnowszych urządzeniach z Androidem 9 i 10.
To zależy od trybu uruchamiania, jak sobie z nim radzisz. Użyj poniższego kodu: - android: launchMode = "singleTask"
Dodaj tę flagę z Intent: - intent.setFlags (Intent.FLAG_ACTIVITY_NEW_TASK);
źródło
Spróbuj przejść do tej linii:
źródło
Chcę tylko zauważyć, że
startActivity
aktywność z zewnątrz jest poprawna w niektórych wersjach Androida (między N i O-MR1), a interesującym punktem jest to, że jest to błąd w kodzie źródłowym Androida!To jest komentarz powyżej
startActivity
implementacji. Zobacz tutaj .źródło
Jeśli chcesz otworzyć działanie w aplikacji, możesz wywołać metodę startActivity () z parametrem Intent jako. Tą intencją byłoby działanie, które chcesz otworzyć. Najpierw musisz utworzyć obiekt o takiej intencji z pierwszym parametrem, który będzie kontekstem, a drugim parametrem, która będzie docelową klasą działania.
Mam nadzieję, że to pomoże.
źródło