仅当应用程序从另一个应用程序的意图启动时,应用程序才会在屏幕旋转时崩溃

时间:2017-10-13 16:22:41

标签: android

好的,我一直在搜索,但我发现与我的应用程序发生的事情类似。我有一个使用IntentService导入和导出文件的应用程序,一切似乎都有效,但是当我通过从其他应用程序中选择兼容文件的意图启动应用程序后旋转屏幕时,我的应用程序崩溃了。如果它在选择文件之前已经运行,它不会崩溃,而且我完全不知道可能发生的事情以及如何解决它。 由于错误是如此奇怪,我不知道哪些信息可能相关,但这里是错误:

java.lang.RuntimeException: 
Unable to instantiate activity ComponentInfo{com.txintxe.dev.xxx/com.txintxe.dev.xxx.services.ExportImportService}: java.lang.ClassCastException: com.txintxe.dev.xxx.services.ExportImportService cannot be cast to android.app.Activity
                                                                        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2586)
                                                                        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2751)
                                                                        at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:4556)
                                                                        at android.app.ActivityThread.-wrap19(ActivityThread.java)
                                                                        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1502)
                                                                        at android.os.Handler.dispatchMessage(Handler.java:102)
                                                                        at android.os.Looper.loop(Looper.java:154)
                                                                        at android.app.ActivityThread.main(ActivityThread.java:6186)
                                                                        at java.lang.reflect.Method.invoke(Native Method)
                                                                        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:889)
                                                                        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:779)
                                                                     Caused by: java.lang.ClassCastException: com.txintxe.dev.saltea.services.ExportImportService cannot be cast to android.app.Activity
                                                                        at android.app.Instrumentation.newActivity(Instrumentation.java:1079)
                                                                        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2576)
                                                                        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2751) 
                                                                        at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:4556) 
                                                                        at android.app.ActivityThread.-wrap19(ActivityThread.java) 
                                                                        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1502) 
                                                                        at android.os.Handler.dispatchMessage(Handler.java:102) 
                                                                        at android.os.Looper.loop(Looper.java:154) 
                                                                        at android.app.ActivityThread.main(ActivityThread.java:6186) 
                                                                        at java.lang.reflect.Method.invoke(Native Method) 
                                                                        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:889) 
                                                                        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:779) 

(我认为)清单的相关部分:

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme">
    <activity
        android:name=".ListActivity"
        android:label="@string/app_name"
        android:launchMode="singleTop"
        android:theme="@style/AppTheme.NoActionBar">

        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>

        <intent-filter>
            <action android:name="android.intent.action.SEARCH" />
        </intent-filter>

        <intent-filter>
            <data
                android:scheme="content"
                android:mimeType="*/*"
                android:host="*"
                />
            <action android:name="android.intent.action.VIEW" />
            <action android:name="android.intent.action.EDIT" />
            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>

        <intent-filter>
            <data
                android:scheme="file"
                android:mimeType="*/*"
                android:pathPattern=".*\\.xxx"
                android:host="*"/>
            <action android:name="android.intent.action.VIEW" />
            <action android:name="android.intent.action.EDIT" />
            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>

        <meta-data
            android:name="android.app.searchable"
            android:resource="@xml/searchable" />
    </activity>

我用来调用IntentService的活动内部的方法:

private void doImportRecipe() {
    Intent intent = getIntent();
    intent.setAction(ExportImportService.ACTION_IMPORT);
    intent.setClass(getApplicationContext(), ExportImportService.class);
    startService(intent);
}

最后是处理IntentService中意图的方法:

protected void onHandleIntent(Intent intent) {
    if (intent != null) {
        final String action = intent.getAction();
        final ArrayList<String> xxxKeys = intent.getStringArrayListExtra(EXTRA_XXXKEYS);
        switch(action) {
            case ACTION_IMPORT:
                final Uri xxxPath = intent.getData();
                handleActionImport(xxxPath);
                break;
            case ACTION_EXPORT:
                handleActionExport(xxxKeys);
                break;
            case ACTION_SHARE:
                handleActionShare(xxxKeys);
                break;
        }
    }
}

如果有更多需要解决它的问题我发布它没有问题,但正如我所说的一切看似有效,除非应用程序是从导入操作启动然后旋转。

2 个答案:

答案 0 :(得分:1)

清单中的

定义您的意图服务类

<service
   android:name=".MyIntentService"
   android:exported="false" />

在您的主课程中启动服务

Intent intent = new Intent(context, MyIntentService.class);
            intent.setAction("your_action");
            startService(intent);

答案 1 :(得分:0)

确定。它似乎现在有效,问题在于重用相同的意图而不是在这里创建一个新的意图:

   private void doImportRecipe(String data) {
    Intent intent = new Intent();
    intent.setAction(ExportImportService.ACTION_IMPORT);
    intent.setClass(getApplicationContext(), ExportImportService.class);
    intent.setData(Uri.parse(data));
    startService(intent);
}

我会继续测试它以确保它现在真的有效,谢谢大家花时间尝试回答:)