17023


WebViewで何かページを表示した後、Backキー押下時エラーが発生します。  
現在、調査中ですが、原因を見つけるアドバイスが欲しいです。

WebViewActivityクラスのsetupUri()に機能を追加してから発生しています。  
追加した機能：WebViewで表示する為にリクエストされたURLを種類によって別のURLに上書きする。

機能の追加の仕方やソースの書き方が綺麗でないのは分かっているんですが、どのように整理したら良いか悩んでいます。

[code]

    package jp.yahuu.hogehoge.app.activities
    
    import android.content.Intent
    import android.net.Uri
    import android.os.Bundle
    import android.webkit.JavascriptInterface
    import android.widget.Toast
    import jp.yahuu.hogehoge.app.R
    import jp.yahuu.hogehoge.app.advertising.AdvertisingIdentifierManager
    import jp.yahuu.hogehoge.app.constants.Constants
    import jp.yahuu.hogehoge.app.data.feed.user.User
    import jp.yahuu.hogehoge.app.fragment.WebFragment
    import jp.yahuu.hogehoge.app.proguardHelper.NonObfuscate
    import jp.yahuu.hogehoge.app.web.*
    import kotlin.properties.Delegates
    
    //import kotlinx.android.synthetic.web_fragment.*
    
    /**
     * Created by henrique on 2/13/15.
     */
    
    //リスタートフラグ(ログアウト用)
    var restartFlag: Boolean = false
    
    public class WebViewActivity(var uri: Uri? = null): DefaultActivity() {
    
        //ログインページがリクエストされた場合に１になるフラグ
       // var loginPageFlag  = 0;
    
    
    
    
    
        private class WebViewFragment():
                WebFragment(),
                AdEventHandlerDelegate,
                FavorEventHandlerDelegate,
                ShareEventHandlerDelegate,
                NewPageEventHandlerDelegate,
                LoginPageEventHandlerDelegate,
                LogoutPageEventHandlerDelegate
        {
            private object KeyName {
    
                val Uri = "Uri"
    
            }
    
    //        class Flag() {
    //            //リスタートフラグ
    //            var restartFlag: Boolean = false
    //
    //        }
    
    
    
    
    
    
    
            public companion object {
                //Function型 fun
                public fun newFragment(uri: Uri): WebViewFragment {
    
                    val fragment = WebViewFragment()
    
                    val args = Bundle()
                    args.putString(KeyName.Uri, uri.toString())
    
                    fragment.setArguments(args)
    
                    return fragment
    
                }
    
            }
    
            private fun getWebViewActivity(): WebViewActivity {
    
                return getActivity() as WebViewActivity
    
            }
    
            override fun getEventHandlers(): Collection<EventHandler> {
    
                return arrayListOf(
                        AdEventHandler(this),
                        FavorEventHandler(this),
                        ShareEventHandler(this),
                        CurrentPageEventHandler(this),
                        NewPageEventHandler(this),
                        LoginPageEventHandler(this),
                        LogoutPageEventHandler(this)
                )
    
            }
    
            override fun setupWebView() {
    
                super<WebFragment>.setupWebView()
    
                webView.addJavascriptInterface(object: NonObfuscate {
    
                    JavascriptInterface
                    public fun startSharing(url: String, title: String) {
    
                        val intent = Intent(Intent.ACTION_SEND)
                        intent.setType("text/plain")
                        intent.putExtra(Intent.EXTRA_TEXT, title + "\n" + url)
                        intent.putExtra(Intent.EXTRA_SUBJECT, title)
    
                        startActivity(Intent.createChooser(intent, "共有"))
    
                    }
    
                }, "Android")
    
            }
    
            // Delegates methods
            override fun openAd(uri: Uri) {
    
                openUri(uri)
    
            }
    
            private fun enfavor(identifier: Int) {
    
                User.addBookmark(identifier)
    
                Toast.makeText(getActivity(), "お気に入りに登録しました", Toast.LENGTH_LONG).show()
    
            }
    
            private fun defavor(identifier: Int) {
    
                User.removeBookmark(identifier)
    
                Toast.makeText(getActivity(), "お気に入りから削除しました", Toast.LENGTH_LONG).show()
    
            }
    
            override fun favorEvent(eventType: FavorEventType, identifier: Int) {
    
                when (eventType) {
    
                    FavorEventType.Enfavor -> enfavor(identifier)
                    FavorEventType.Defavor -> defavor(identifier)
    
                }
    
            }
    
            override fun shareEvent() {
    
                webView.loadUrl("javascript:Android.startSharing(get_actual_URL(),get_actual_title());")
    
            }
    
            //新しいアクティビティの場合？
            override fun openUriInNewPage(uri: Uri) {
    
                openUriInNewWebViewActivity(uri)
    
    
            }
    
    
            override fun showLoginPage() {
    
                val uri = Uri.parse("https://yahuu-ni.jp/users/sign_in")
                openUriInNewPage(uri)
    
            }
    
    
    
    
    
    
            override fun userWillLogout() {
    
                //クッキーを削除して、トップ画面に遷移する。
    
                println("ログアウトをタッチした。")
    
                val uri = Uri.parse("https://yahuu-ni.jp/logout")
                openUriInNewPage(uri)
    
                restartFlag = true
    
    
    //            //再起動フラグを上げる
    //            restart()
    
    //            //ダイアログでログアウトを選択した場合？
    //            userDidLogout()
    
    //            val uri = Uri.parse("https://yahuu-ni.jp/logout")
    //            openUriInNewPage(uri)
    
            }
    
    
    
            override fun userDidLogout() {
                println("userDidLogout")
            }
    
        }
    
        private object RegexPattern {
    
            val ArticlePattern = "-?\\d+(\\.\\d+)?"
    
        }
    
        private val articleRegex by Delegates.lazy {
    
            WebViewActivity.RegexPattern.ArticlePattern.toRegex()
    
        }
    
        private fun setupUri() {
    
    
    
                if (this.uri == null) {
    
                    //varは通常の変数
                    var u = getIntent()
                            .getStringExtra(
                                    getResources()
                                            .getString(R.string.default_webview_activity_uri)
                            )
                    println("u: $u")
    
                    //トップページがリクエストされた場合
                    //ログイン後遷移http://yahuu-ni.jp/,アプリ起動時https://yahuu-ni.jp/
    
                    //ログアウト後遷移https://yahuu-ni.jp/
    
                        if(u.equals("http://yahuu-ni.jp/") || u.equals("https://yahuu-ni.jp/")){
                           //上書きuri
                            u = "http://yahuu-ni.jp/mypage"
                        }
    
    
    
                        //urlがnullじゃない場合
                        if (u != null) {
    
    
                            //もしuがnullの場合NullPointerException
                            val parsedUri = Uri.parse(u)
    
                            //ドメインがやほー（teru or false）
                            val ishogehoge = Constants.ishogehogeDomain(parsedUri
                            )
    
    
                            //ドメインがやほーの場合
                            val newUri: Uri = if (ishogehoge) {
    
    
                                println("parsedUri: $parsedUri")
                                println("articleRegex: $articleRegex")
    
    
                                // ログイン済みの場合、「https://yahuu-ni.jp/」が再リクエストされてここ落ちる
                                //パス部がnull
                                //parsedUri → https://yahuu-ni.jp/users/sign_in　isArticle:false
                                val isArticle = parsedUri.getLastPathSegment().matches(articleRegex)
                                println("isArticle: $isArticle")
    
                                //article(記事)の場合？
                                val builder: Uri.Builder = if (isArticle) {
    
                                    val identifier = parsedUri.getLastPathSegment().toInt()
    
                                    User.addHistory(identifier)
    
                                    val favored = User.containsInBookmark(identifier)
    
                                    val flag = if (favored) {
                                        1
                                    } else {
                                        0
                                    }
    
                                    parsedUri.buildUpon()
                                            .appendQueryParameter("favored", "$flag")
    
    
                                    //記事以外の場合
                                } else {
    
    
                                    parsedUri.buildUpon()
    
                                }
    
                                builder.appendQueryParameter(
                                        "idfa",
                                        AdvertisingIdentifierManager.information.identifier
                                ).build()
    
                            } else {
    
                                parsedUri
    
                            }
    
                            this.uri = newUri
    
                            println("new Uri: $newUri")
    
    
    
                        }
    
    
    
                }
    
    
        }
    
    
        //リスタート処理
        private fun restart(){
            println("restart")
            if (restartFlag) {
    //            //fragmentの終了 onDestroyが呼び出される
    ////            getFragmentManager().beginTransaction().remove(this).commit()
    //
    ////            getFragmentManager().popBackStack()
    //            activity.finish();
    
    
    
                val intent = getIntent()
                overridePendingTransition(0, 0)
                intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION)
                finish()
                overridePendingTransition(0, 0)
    
                startActivity(intent)
    
    
            }
        }
    
        /***
         * Fragmentが破棄される時、最後に呼び出される
         */
        @Override
        override fun onDestroy() {
    //     まずはデストロイを走らせる、アクティビティのフィニッシュか？fragmentか？   http://attyo0.blog.fc2.com/blog-entry-9.html
    
            println("onDestroy")
            if (restartFlag) {
                restartFlag = false;
                //ここにメインアクティビティのインテント
    
                //            val intent = Intent(getApplicationContext(), javaClass<MainActivity>())
                ////            intent.putExtra(getResources().getString(R.string.default_webview_activity_uri), uri.toString())
                //
                //            startActivity(intent)
                println("ここにメインアクティビティのインテント")
            }
        }
    
    
        override fun onCreate(savedInstanceState: Bundle?) {
    
            super<DefaultActivity>.onCreate(savedInstanceState)
            setContentView(R.layout.activity_webview)
    
            //ログアウト
            if (restartFlag) {
                println("restart()　アプリ再起動")
                restart()
            }
    
            println("setupUri()")
            setupUri()
    
            if (savedInstanceState == null) {
    
                val newFragment = WebViewFragment.newFragment(uri!!)
    
                getFragmentManager()
                        .beginTransaction()
                        .add(R.id.web_view_container, newFragment)
                        .commit()
    
            }
    
            getSupportActionBar().hide()
    
        }
    
    
    
    }
    
[/code]

↓↓↓↓↓↓↓↓↓↓↓↓↓↓エラーログ↓↓↓↓↓↓↓↓↓↓↓↓↓↓

[code]

    09-28 12:04:47.297  13985-13985/jp.yahuu.hogehoge.app I/System.out﹕ onDestroy
    09-28 12:04:47.297  13985-13985/jp.yahuu.hogehoge.app D/AndroidRuntime﹕ Shutting down VM
    09-28 12:04:47.297  13985-13985/jp.yahuu.hogehoge.app E/CrashReporting﹕ ParseCrashReporting caught a SuperNotCalledException exception for jp.yahuu.hogehoge.app. Building report.
    09-28 12:04:47.300  13985-13985/jp.yahuu.hogehoge.app E/CrashReporting﹕ Handling exception for crash
        android.util.SuperNotCalledException: Activity {jp.yahuu.hogehoge.app/jp.yahuu.hogehoge.app.activities.WebViewActivity} did not call through to super.onDestroy()
                at android.app.ActivityThread.performDestroyActivity(ActivityThread.java:3695)
                at android.app.ActivityThread.handleDestroyActivity(ActivityThread.java:3724)
                at android.app.ActivityThread.access$1400(ActivityThread.java:151)
                at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1357)
                at android.os.Handler.dispatchMessage(Handler.java:102)
                at android.os.Looper.loop(Looper.java:135)
                at android.app.ActivityThread.main(ActivityThread.java:5254)
                at java.lang.reflect.Method.invoke(Native Method)
                at java.lang.reflect.Method.invoke(Method.java:372)
                at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
                at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
    09-28 12:04:47.300  13985-13985/jp.yahuu.hogehoge.app D/CrashReporting﹕ Generating report file for crash
        --------- beginning of system
    09-28 12:04:47.395  13985-13985/jp.yahuu.hogehoge.app W/ge.hogehoge.app﹕ type=1400 audit(0.0:58): avc: denied { read } for name="mem" dev="debugfs" ino=443991 scontext=u:r:untrusted_app:s0 tcontext=u:object_r:debugfs:s0 tclass=file
    09-28 12:04:47.395  13985-13985/jp.yahuu.hogehoge.app W/ge.hogehoge.app﹕ type=1400 audit(0.0:59): avc: denied { read } for name="mem" dev="debugfs" ino=443991 scontext=u:r:untrusted_app:s0 tcontext=u:object_r:debugfs:s0 tclass=file
    09-28 12:04:47.471  13985-13985/jp.yahuu.hogehoge.app D/CrashReporting﹕ Retrieving logcat output...
    09-28 12:04:47.526  13985-13985/jp.yahuu.hogehoge.app D/CrashReporting﹕ Retrieving logcat output...
    09-28 12:04:47.576  13985-13985/jp.yahuu.hogehoge.app D/CrashReporting﹕ Retrieving logcat output...
    09-28 12:04:47.653  13985-13985/jp.yahuu.hogehoge.app V/CrashReporting﹕ About to start ReportSenderWorker from #handleException
    09-28 12:04:47.657  13985-15035/jp.yahuu.hogehoge.app D/CrashReporting﹕ #checkAndSendReports - start
    09-28 12:04:47.657  13985-15035/jp.yahuu.hogehoge.app D/CrashReporting﹕ Looking for error files in /data/data/jp.yahuu.hogehoge.app/files/com.parse/cr/reports
    09-28 12:04:47.657  13985-15035/jp.yahuu.hogehoge.app D/CrashReporting﹕ Loading file 1443409487300-SuperNotCalledException-10.stacktrace
    09-28 12:04:47.664  13985-15035/jp.yahuu.hogehoge.app I/CrashReporting﹕ Sending file 1443409487300-SuperNotCalledException-10.stacktrace
    09-28 12:04:47.664  13985-15035/jp.yahuu.hogehoge.app D/CrashReporting﹕ Sending crash report to Parse...
    09-28 12:04:47.667  13985-15035/jp.yahuu.hogehoge.app D/CrashReporting﹕ #checkAndSendReports - finish
        --------- beginning of crash
    09-28 12:04:47.755  13985-13985/jp.yahuu.hogehoge.app E/AndroidRuntime﹕ FATAL EXCEPTION: main
        Process: jp.yahuu.hogehoge.app, PID: 13985
        android.util.SuperNotCalledException: Activity {jp.yahuu.hogehoge.app/jp.yahuu.hogehoge.app.activities.WebViewActivity} did not call through to super.onDestroy()
                at android.app.ActivityThread.performDestroyActivity(ActivityThread.java:3695)
                at android.app.ActivityThread.handleDestroyActivity(ActivityThread.java:3724)
                at android.app.ActivityThread.access$1400(ActivityThread.java:151)
                at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1357)
                at android.os.Handler.dispatchMessage(Handler.java:102)
                at android.os.Looper.loop(Looper.java:135)
                at android.app.ActivityThread.main(ActivityThread.java:5254)
                at java.lang.reflect.Method.invoke(Native Method)
                at java.lang.reflect.Method.invoke(Method.java:372)
                at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
                at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
    
[/code]


CC BY-SA 3.0
2015-09-28T07:20:26.790
17022
2015-09-28T11:38:08.843
2015-09-28T11:38:08.843
10715
10715
question
android java android-studio kotlin
Backキー　押下時のエラー


`onDestroy()`で`super<DefaultActivity>.onDestroy()`を呼んでいないのが原因です。Activityのライフサイクルイベント(onで始まるメソッド)は内部でsuperのメソッドが呼ばれているかを管理しており、オーバーライド先で呼んでいないと記述されたようにエラーとなります。


CC BY-SA 3.0
2015-09-28T07:25:06.170
17023
2015-09-28T07:25:06.170
845
17022
answer