Страница 1 из 1

Крэши: Calling startActivity() from outside of an Activity..

Добавлено: 17 авг 2015, 23:47
yura3d
Привет, ребята.
Допиливаю одно из своих приложений, и уже неделю никак не могу победить следующие однотипные крэши, заполонившие мой Crashlytics:
android.util.AndroidRuntimeException: Calling startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?
Вся инфа, которую удалось нагуглить по данному вопросу, сводилась к тому, что ошибка проявляется при попытке вызова метода startActivity() у контекста приложения (возвращаемого getApplicationContext()), а не у текущей Activity. Я ещё раз внимательно изучил в проекте все вызовы startActivity() и не нашёл у себя подобной причины, все вызовы идут в рамках либо Activity, либо Fragment.

Может кто сталкивался с подобным?

Полный стек трейс:

Код: Выделить всё

android.util.AndroidRuntimeException: Calling startActivity() from outside of an Activity  context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?
       at android.app.ContextImpl.startActivity(ContextImpl.java:1016)
       at android.app.ContextImpl.startActivity(ContextImpl.java:1003)
       at android.content.ContextWrapper.startActivity(ContextWrapper.java:284)
       at android.webkit.CallbackProxy.uiOverrideUrlLoading(CallbackProxy.java:291)
       at android.webkit.CallbackProxy.handleMessage(CallbackProxy.java:381)
       at android.os.Handler.dispatchMessage(Handler.java:99)
       at android.os.Looper.loop(Looper.java:153)
       at android.app.ActivityThread.main(ActivityThread.java:5341)
       at java.lang.reflect.Method.invokeNative(Method.java)
       at java.lang.reflect.Method.invoke(Method.java:511)
       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:929)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:696)
       at dalvik.system.NativeStart.main(NativeStart.java)

Re: Крэши: Calling startActivity() from outside of an Activi

Добавлено: 18 авг 2015, 11:36
Mikhail_dev
Стартовать активность надо с контекстом активности, а не контекстом getApplicationContext().

Re: Крэши: Calling startActivity() from outside of an Activi

Добавлено: 18 авг 2015, 11:38
doter.ua
скинь все методы startActivity()

Re: Крэши: Calling startActivity() from outside of an Activi

Добавлено: 18 авг 2015, 12:15
yura3d
Mikhail_dev писал(а):Стартовать активность надо с контекстом активности, а не контекстом getApplicationContext().
Именно так у меня и сделано.
doter.ua писал(а):скинь все методы startActivity()
Все активити у меня запускаются следующими способами:
  1. Запуск Активити из другого Активити (внутри одного из методов Activity):

    Код: Выделить всё

    Intent intent = new Intent(this, MyListActivity.class);
    startActivity(intent);
  2. Запуск Активити из Фрагмента (внутри одного из методов Fragment):

    Код: Выделить всё

    Intent intent = new Intent(getActivity(), ItemActivity.class);
    startActivityForResult(intent, CarActivity.REQUEST_CAR);
Вызовов getApplicationContext().startActivity() и других ему подобных, где фигурировал бы контекст приложения (а не активити), у меня нигде нет.
Повторить этот вылет на своих устройствах и в эмуляторе у меня не получается. А в отчётах об этом вылете на Crashlytics и Google Play Developer Console не содержится ни одной моей строчки кода.

Re: Крэши: Calling startActivity() from outside of an Activi

Добавлено: 18 авг 2015, 13:35
Mikhail_dev
Отсюда - https://groups.google.com/forum/#!topic ... mz5Je5-iLs
It actually says it right there: 3 at android.webkit.CallbackProxy.uiOverrideUrlLoading(CallbackProxy.java:236)
The user is clicking a hyperlink in a webview which is attached to the Application Context. Figure out which webview it is, set a webViewClient and override shouldOverrideUrlLoading to open the hyperlink properly.
У вас WebView с контекстом приложения взаимодействует?

Re: Крэши: Calling startActivity() from outside of an Activi

Добавлено: 18 авг 2015, 13:57
yura3d
Mikhail_dev писал(а):Отсюда - https://groups.google.com/forum/#!topic ... mz5Je5-iLs
It actually says it right there: 3 at android.webkit.CallbackProxy.uiOverrideUrlLoading(CallbackProxy.java:236)
The user is clicking a hyperlink in a webview which is attached to the Application Context. Figure out which webview it is, set a webViewClient and override shouldOverrideUrlLoading to open the hyperlink properly.
У вас WebView с контекстом приложения взаимодействует?
Да, взаимодействует. WebView создаётся в синглтоне-наследнике Application, и обращение к нему происходит практически из всех Activity приложения. По сути, он используется для открытия страницы со счётчиками моего сайта, чтобы в статистике сайта учитывались также и пользователи приложения. Графически этот WebView нигде не отображается, создаётся программно (new WebView(getApplicationContext())) и ни в какие layout-ы не добавляется.
Как лучше поступить? Передавать в конструктор WebView в качестве контекста контекст текущей Activity вместо контекста приложения, или же установить для WebView свой WebViewClient с переопределённым методом shouldOverrideUrlLoading(), как сказано по ссылке, что Вы привели?

Re: Крэши: Calling startActivity() from outside of an Activi

Добавлено: 18 авг 2015, 20:14
Mikhail_dev
Я с WebView почти не работал, поэтому к сожалению не подскажу.

Re: Крэши: Calling startActivity() from outside of an Activi

Добавлено: 19 авг 2015, 22:55
yura3d
Mikhail_dev писал(а):Я с WebView почти не работал, поэтому к сожалению не подскажу.
Проблема с вылетами решилась следующим образом. Сразу после создания WebView:

Код: Выделить всё

mWebView = new WebView(getApplicationContext());
для него был установлен WebViewClient с переопределённым методом shouldOverrideUrlLoading():

Код: Выделить всё

mWebView.setWebViewClient(new WebViewClient() {
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        return false;
    }
});
Теперь Crashlytics молчит. Спасибо за наводку.