【问题标题】:MainActivity is not started from startActivity(i) anymore although no changes in code were madeMainActivity 不再从 startActivity(i) 启动,尽管没有对代码进行任何更改
【发布时间】:2020-09-28 19:40:38
【问题描述】:

几天前,我的应用停止在多台设备上运行。该代码至少有一年没有被触及(即:最近没有进行任何更改)。它从一个 SplashScreenActivity 开始,其中一些数据是从一个 sql 数据库下载的,它工作得很好。之后,此数据是 putExtra 到用于启动 MainActivity 的 Intent - 这就是应用程序突然关闭的地方。通过调试,我知道 Intent 仍然正确创建,但在 MainActivity 中没有调用“onCreate”。我不知道中间是什么以及为什么它停止工作,也许是关于依赖关系的东西?有什么想法吗?

下面是 SplashScreen 的代码和 MainActivity 的 onCreate 方法,以及 build.gradle(应用程序),我在其中进行了一些更改以尝试解决问题(弃用的编译更改为依赖项的实现和版本以及 sdkVersion )。这并没有解决问题。

build.gradle:


    apply plugin: 'com.android.application'
    
    android {
        compileSdkVersion 26
        buildToolsVersion '26.0.2'
        defaultConfig {
            applicationId "com.myname.myapp"
            minSdkVersion 19
            targetSdkVersion 26
            versionCode 14
            versionName "1.51"
            testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
            multiDexEnabled true
        }
        buildTypes {
            release {
                minifyEnabled false
                proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            }
        }
        compileOptions {
            targetCompatibility = 1.8
            sourceCompatibility = 1.8
        }
    }
    
    dependencies {
        implementation fileTree(dir: 'libs', include: ['*.jar'])
        androidTestImplementation('com.android.support.test.espresso:espresso-core:3.0.2', {
            exclude group: 'com.android.support', module: 'support-annotations'
        })
        implementation 'com.android.support:multidex:1.0.3'
        implementation 'com.android.support:appcompat-v7:26.1.0'
        implementation 'com.android.support:recyclerview-v7:26.1.0'
        implementation 'com.google.android.gms:play-services:12.0.1'
        testImplementation 'junit:junit:4.12'
    }

SplashScreenActivity:


    package com.myname.myapp;
    
    import android.app.Activity;
    import android.content.Context;
    import android.content.Intent;
    import android.content.SharedPreferences;
    import android.net.ConnectivityManager;
    import android.net.NetworkInfo;
    import android.os.Bundle;
    import android.preference.PreferenceManager;
    import android.widget.TextView;
    import android.widget.Toast;
    
    import java.util.ArrayList;
    
    public class SplashScreen extends Activity {
    
        private String mAccessCode; // --> DatabaseID
        public String getmAccessCode() {
            return mAccessCode;
        }
        public void setmAccessCode(String mAccessCode) {
            this.mAccessCode = mAccessCode;
        }
    
        private String getPrefsString(String prefName) {
            SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
            return sharedPreferences.getString(prefName, getString(R.string.default_access_code));
    
        }
    
        public boolean isOnline() {
            ConnectivityManager connMgr = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
            NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();
            return (networkInfo != null && networkInfo.isConnected());
        }
    
        ArrayList<String> strResult = new ArrayList<>();
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_splash);
            TextView textViewVersionName = findViewById(R.id.textViewVersionName);
            textViewVersionName.setText("Version " + BuildConfig.VERSION_NAME);
    
            setmAccessCode(getPrefsString("AccessCode"));
    
            if (isOnline()) {

            new Handler().postDelayed(new Runnable() {
                @Override
                public void run() {
                    strResult.add(new DataTransfer().receiveDataFromDatabase(getString(R.string.sql_id_users), "0", getString(R.string.url_receive), getmAccessCode()));
                    strResult.add(new DataTransfer().receiveDataFromDatabase(getString(R.string.sql_id_ridesByDate), "0", getString(R.string.url_receive), getmAccessCode()));
                    strResult.add(new DataTransfer().receiveDataFromDatabase(getString(R.string.sql_id_ridesByDriverID), "0", getString(R.string.url_receive), getmAccessCode()));
                    strResult.add(new DataTransfer().receiveDataFromDatabase(getString(R.string.sql_id_passengersByDate), "0", getString(R.string.url_receive), getmAccessCode()));
                    Intent i = new Intent(SplashScreen.this, MainActivity.class);
                    i.putStringArrayListExtra("tableContents", strResult);
                    startActivity(i);
                    finish();
                }

            }, 1500);
    
            } else {
            Toast toast = Toast.makeText(getApplicationContext(), R.string.connection_error, Toast.LENGTH_LONG);
            toast.show();
            finish();
        }
        }
    }

主活动:


    @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            Intent i = getIntent();
            ArrayList<String> tableContents = i.getStringArrayListExtra("tableContents");
            initActivity(tableContents);
    
        }

如果还有什么我应该发布的,请发表评论。感谢您的帮助!

编辑:这是日志

2019-09-17 10:25:35.127 13305-13305/? I/name.myap: Not late-enabling -Xcheck:jni (already on)
2019-09-17 10:25:35.151 13305-13305/? E/name.myap: Unknown bits set in runtime_flags: 0x8000
2019-09-17 10:25:35.153 13305-13305/? W/name.myap: Unexpected CPU variant for X86 using defaults: x86
2019-09-17 10:25:35.230 13305-13305/? I/name.myap: The ClassLoaderContext is a special shared library.
2019-09-17 10:25:36.608 13305-13305/com.myname.myapp I/MultiDex: VM with version 2.1.0 has multidex support
2019-09-17 10:25:36.608 13305-13305/com.myname.myapp I/MultiDex: Installing application
2019-09-17 10:25:36.608 13305-13305/com.myname.myapp I/MultiDex: VM has multidex support, MultiDex support library is disabled.
2019-09-17 10:25:36.626 13305-13305/com.myname.myapp I/FirebaseInitProvider: FirebaseApp initialization unsuccessful
2019-09-17 10:25:36.644 13305-13338/com.myname.myapp D/libEGL: Emulator has host GPU support, qemu.gles is set to 1.
2019-09-17 10:25:36.644 13305-13338/com.myname.myapp W/libc: Unable to set property "qemu.gles" to "1": connection failed; errno=13 (Permission denied)
2019-09-17 10:25:36.634 13305-13305/com.myname.myapp W/RenderThread: type=1400 audit(0.0:70): avc: denied { write } for name="property_service" dev="tmpfs" ino=6782 scontext=u:r:untrusted_app_27:s0:c512,c768 tcontext=u:object_r:property_socket:s0 tclass=sock_file permissive=0
2019-09-17 10:25:36.703 13305-13338/com.myname.myapp D/libEGL: loaded /vendor/lib/egl/libEGL_emulation.so
2019-09-17 10:25:36.710 13305-13338/com.myname.myapp D/libEGL: loaded /vendor/lib/egl/libGLESv1_CM_emulation.so
2019-09-17 10:25:36.719 13305-13338/com.myname.myapp D/libEGL: loaded /vendor/lib/egl/libGLESv2_emulation.so
2019-09-17 10:25:36.803 13305-13341/com.myname.myapp D/NetworkSecurityConfig: No Network Security Config specified, using platform default
2019-09-17 10:25:36.831 13305-13336/com.myname.myapp W/OpenGLRenderer: Failed to choose config with EGL_SWAP_BEHAVIOR_PRESERVED, retrying without...
2019-09-17 10:25:36.862 13305-13336/com.myname.myapp D/eglCodecCommon: setVertexArrayObject: set vao to 0 (0) 0 0
2019-09-17 10:25:36.862 13305-13336/com.myname.myapp D/EGL_emulation: eglCreateContext: 0xe5bf00a0: maj 2 min 0 rcv 2
2019-09-17 10:25:36.872 13305-13336/com.myname.myapp D/EGL_emulation: eglMakeCurrent: 0xe5bf00a0: ver 2 0 (tinfo 0xf0da9bd0)
2019-09-17 10:25:36.903 13305-13336/com.myname.myapp W/Gralloc3: mapper 3.x is not supported
2019-09-17 10:25:36.925 13305-13336/com.myname.myapp D/EGL_emulation: eglMakeCurrent: 0xe5bf00a0: ver 2 0 (tinfo 0xf0da9bd0)
2019-09-17 10:25:36.947 13305-13336/com.myname.myapp D/eglCodecCommon: setVertexArrayObject: set vao to 0 (0) 1 0

编辑 2:现在有一条新的错误消息可能会有所帮助:


    2019-09-17 13:28:13.400 1669-2304/? E/ActivityManager: Second failure launching com.myname.myapp/.MainActivity, giving up
        android.os.TransactionTooLargeException: data parcel size 520984 bytes
            at android.os.BinderProxy.transactNative(Native Method)
            at android.os.BinderProxy.transact(Binder.java:748)
            at android.app.IApplicationThread$Stub$Proxy.scheduleLaunchActivity(IApplicationThread.java:1230)
            at com.android.server.am.ActivityStackSupervisor.realStartActivityLocked(ActivityStackSupervisor.java:1467)
            at com.android.server.am.ActivityStackSupervisor.attachApplicationLocked(ActivityStackSupervisor.java:972)
            at com.android.server.am.ActivityManagerService.attachApplicationLocked(ActivityManagerService.java:6958)
            at com.android.server.am.ActivityManagerService.attachApplication(ActivityManagerService.java:7025)
            at android.app.IActivityManager$Stub.onTransact(IActivityManager.java:291)
            at com.android.server.am.ActivityManagerService.onTransact(ActivityManagerService.java:2935)
            at android.os.Binder.execTransact(Binder.java:674)
    2019-09-17 13:28:13.434 1669-1690/? E/ViewRootImpl[myapp]: Attempting to destroy the window while drawing!
          window=android.view.ViewRootImpl@da270ff, title=Splash Screen com.myname.myapp

【问题讨论】:

  • 你能发布日志吗?所以我们可以看到它有任何异常
  • 我添加了日志,谢谢。
  • 尝试在你的应用类中添加 MultiDex.install(base)
  • 喜欢这个? @Override protected void attachBaseContext(Context base) { super.attachBaseContext(base); MultiDex.install(this); } 同样的结果。
  • 在 mainActivity getIntent() 中抛出异常。 bcoz 你传递的 ArrayList。尝试放入 try-catch 或检查 getIntent() not null。

标签: java android android-intent android-activity dependencies


【解决方案1】:

您尚未共享 Logcat 错误堆栈,这将有助于进一步了解该问题。但似乎您正在尝试从新线程而不是 UI 线程启动活动,因此应用程序正在崩溃,只需移出可运行的 run 方法中的代码,不要启动新线程。如果出于某种原因您希望代码异步运行,请通过处理程序运行 Runnable。下面是sn-p

if (isOnline()) {

    new Handler().postDelayed(new Runnable() {
        @Override
        public void run() {
            strResult.add(new DataTransfer().receiveDataFromDatabase(getString(R.string.sql_id_users), "0", getString(R.string.url_receive), getmAccessCode()));
            strResult.add(new DataTransfer().receiveDataFromDatabase(getString(R.string.sql_id_ridesByDate), "0", getString(R.string.url_receive), getmAccessCode()));
            strResult.add(new DataTransfer().receiveDataFromDatabase(getString(R.string.sql_id_ridesByDriverID), "0", getString(R.string.url_receive), getmAccessCode()));
            strResult.add(new DataTransfer().receiveDataFromDatabase(getString(R.string.sql_id_passengersByDate), "0", getString(R.string.url_receive), getmAccessCode()));
            Intent i = new Intent(SplashScreen.this, MainActivity.class);
            i.putStringArrayListExtra("tableContents", strResult);
            startActivity(i);
            finish();
        }

    },1000);
}

【讨论】:

  • 谢谢,我现在将日志添加到原始帖子中。我测试了你的建议,恐怕它没有任何区别。我想我会保留更改,它可能仍然比我的原始版本更好。
  • 我错了,使用您的代码,SplashScreen 不再显示,应用程序更早崩溃。所以我必须保留我的版本。
  • 还有一件事,当您在意图中传递 arraList 时,使用 i.putStringArrayListExtra("tableContents", strResult) 而不是 i.putExtra("tableContents", strResult)
  • 如果你想显示 SplashScreen 并在延迟一段时间后移动到 MainActivity,你可以使用 Handler.postDelayed(Runnable, delay in miliseconds) 而不是 Hanlder.post()
  • 按预期工作,但它并不能解决一般问题。我应该编辑原始帖子并将启动屏幕代码更改为新版本吗?
【解决方案2】:

我找到了答案,它解释了为什么行为发生了变化,尽管代码没有变化:

随着数据库随着时间的推移,字符串strResult 变得大于使用putStringArrayListExtra 可以放入Intent 的最大长度。在我的情况下,我可以简单地减少数据量,这显然不是每种情况下的解决方案。所有其他建议的代码更改都会导致更好的样式,因此感谢您的回答!

【讨论】:

    猜你喜欢
    • 2021-04-28
    • 2022-06-15
    • 1970-01-01
    • 1970-01-01
    • 2019-02-27
    • 1970-01-01
    • 2013-12-31
    • 1970-01-01
    • 2023-03-26
    相关资源
    最近更新 更多