簡體   English   中英

啟動另一個用於查看文件的活動時,該活動被銷毀

[英]Activity getting destroyed when starting another activity for file viewing

我正在執行文件查看操作,如下所示:

private void openFile(File file, String format) {
    try {
        if (file.exists()) {
            Uri path = Uri.fromFile(file);
            Intent intent = new Intent(Intent.ACTION_VIEW);
            String mimeType = "*/*";
            if (format.length() > 0) {
                mimeType = MimeTypeMap.getSingleton()
                        .getMimeTypeFromExtension(format);
                if (mimeType == null)
                    mimeType = "*/*";
            } else
                mimeType = "*/*";
            intent.setDataAndType(path, mimeType);

            try {
                startActivity(intent);
            } catch (Exception e) {
                Toast.makeText(LoginSuccessActivity.this,
                        constants.Error_NoCompatibleApp, Toast.LENGTH_SHORT)
                        .show();
                e.printStackTrace();
            }
        } else {
            Toast.makeText(LoginSuccessActivity.this,
                    constants.Error_DocNotFound, Toast.LENGTH_SHORT).show();
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

這工作正常,因為我得到了具有與之相關的多個應用程序的文件類型的應用程序選擇器彈出窗口(例如,word文件的金山辦公和Polaris Office),或者直接為僅具有一個應用程序相關的文件類型打開了文件到它(用於HTML文件的HTMLViewer)。

我不明白的是,調用文件查看器活動后不久,我的主要活動就被破壞了。 我已經通過將日志放在onPause()onStop()onDestroy() 因此,查看完文件后,當我按返回鍵時,而不是回到應用程序,而是導航到主菜單。

我嘗試了startActivityForResult(intent, 1); 而不是startActivity(intent); 希望它能保留我的主要活動,因為它會等待結果,但無濟於事。

請注意,我已在清單文件中添加了android:configChanges="orientation|screenSize"

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
}

在java文件中。

我做錯什么了嗎?

任何幫助表示贊賞。

有時,請注意,“有時”,我在日志中收到以下消息:

 file:// Uri exposed through Intent.getData()
 java.lang.Throwable: file:// Uri exposed through Intent.getData()
    at android.os.StrictMode.onFileUriExposed(StrictMode.java:1597)
    at android.net.Uri.checkFileUriExposed(Uri.java:2338)
    at android.content.Intent.prepareToLeaveProcess(Intent.java:7194)
    at android.app.Instrumentation.execStartActivity(Instrumentation.java:1418)
    at android.app.Activity.startActivityForResult(Activity.java:3423)
    at android.app.Activity.startActivityForResult(Activity.java:3384)
    at android.app.Activity.startActivity(Activity.java:3626)
    at android.app.Activity.startActivity(Activity.java:3594)
    at com.android.internal.app.ResolverActivity.onIntentSelected(ResolverActivity.java:407)
    at com.android.internal.app.ResolverActivity.startSelected(ResolverActivity.java:299)
    at com.android.internal.app.ResolverActivity.onButtonClick(ResolverActivity.java:289)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:515)
    at android.view.View$1.onClick(View.java:3809)
    at android.view.View.performClick(View.java:4424)
    at android.view.View$PerformClick.run(View.java:18383)
    at android.os.Handler.handleCallback(Handler.java:733)
    at android.os.Handler.dispatchMessage(Handler.java:95)
    at android.os.Looper.loop(Looper.java:137)
    at android.app.ActivityThread.main(ActivityThread.java:4998)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:515)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:777)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:593)
    at dalvik.system.NativeStart.main(Native Method)

將這些行添加到您的Intent然后嘗試啟動Activity,

intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setType(Your_MimeType);

我在我的應用程序中使用此代碼

String MimeType = URLConnection.guessContentTypeFromName(myFile.getAbsolutePath());

Intent intent = new Intent(android.content.Intent.ACTION_VIEW); 
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setType(MimeType);
Uri uri_path = Uri.fromFile(myFile);
intent.setDataAndType(uri_path, MimeType);
try
{
    _context.startActivity(intent);
}
catch(ActivityNotFoundException e)
{
    Toast.makeText(_context,"Activity Not Found..", Toast.LENGTH_SHORT).show();
}

也請參考鏈接以獲得更好的理解

希望對您有幫助。

活動可能隨時被破壞。 如果有人要保留一些數據,可以執行以下操作:

class MyActivity {

private String mMyString;

public void onSaveInstanceState(Bundle b) {

b.putString("MYDATA", mMyString);
super.onSaveInstanceState(b);
}

public void onCreate(Bundle savedState) {
super.onCreate(savedState)
if(savedState != null) {
 mMyString = savedState.getString("MYDATA");
}

}

您可以通過這種方式創建自己的子類private static class State implements Serializable並將其保存在onSaveInstanceState()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM