2014-02-21 47 views
0

試圖執行從另一個類中調用的Asynctask備份例程時,我收到消息 「無法將實例化活動無法轉換爲android.app。活動。」 編譯成功,但執行失敗。 我對Intent進行了一項研究,但找不到我的出路。 我知道發生了什麼很重要,因爲我計劃在應用程序的生命週期中讓其他類 調用Asynctasks。 如果需要更多數據,請讓我知道。源代碼相當大,我沒有看到 轉儲最終無用的信息。我寧願發送與問題相關的內容。
謝謝無法實例化活動無法轉換爲android.app.Activity

第一次調用:

public class MainActivity extends Activity implements OnClickListener { 

} else if (v == backupDbButton){ 
    startActivity (new Intent(this, CheckSDDB.class)); 

第二個電話:

public class CheckSDDB extends Activity { 

    Intent intent = new Intent(CheckSDDB.this,RunBackup.class); 
    startActivity(intent); 

最後一個組件:

public class RunBackup extends AsyncTask<Void, Void, Integer> { 

登錄:

02-21 15:14:15.067: E/AndroidRuntime(18123): java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.peter.databasetest/com.peter.databasetest.RunBackup}: java.lang.ClassCastException: com.peter.databasetest.RunBackup cannot be cast to android.app.Activity 02-21 15:14:15.067: E/AndroidRuntime(18123): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1983) 
02-21 15:14:15.067: E/AndroidRuntime(18123): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084) 
02-21 15:14:15.067: E/AndroidRuntime(18123): at android.app.ActivityThread.access$600(ActivityThread.java:130) 
02-21 15:14:15.067: E/AndroidRuntime(18123): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195) 
02-21 15:14:15.067: E/AndroidRuntime(18123): at android.os.Handler.dispatchMessage(Handler.java:99) 
02-21 15:14:15.067: E/AndroidRuntime(18123): at android.os.Looper.loop(Looper.java:137) 
02-21 15:14:15.067: E/AndroidRuntime(18123): at android.app.ActivityThread.main(ActivityThread.java:4745) 
02-21 15:14:15.067: E/AndroidRuntime(18123): at java.lang.reflect.Method.invokeNative(Native Method) 
02-21 15:14:15.067: E/AndroidRuntime(18123): at java.lang.reflect.Method.invoke(Method.java:511) 
02-21 15:14:15.067: E/AndroidRuntime(18123): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 
02-21 15:14:15.067: E/AndroidRuntime(18123): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
02-21 15:14:15.067: E/AndroidRuntime(18123): at dalvik.system.NativeStart.main(Native Method) 
02-21 15:14:15.067: E/AndroidRuntime(18123): Caused by: java.lang.ClassCastException: com.peter.databasetest.RunBackup cannot be cast to android.app.Activity 
02-21 15:14:15.067: E/AndroidRuntime(18123): at android.app.Instrumentation.newActivity(Instrumentation.java:1053) 
02-21 15:14:15.067: E/AndroidRuntime(18123): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1974) 
02-21 15:14:15.067: E/AndroidRuntime(18123): ... 11 more 

Manifest (partial) 


<activity 
android:name="com.peter.databasetest.MainActivity" 
android:label="@string/app_name" > 
<intent-filter> 
<action android:name="android.intent.action.MAIN" /> 

<category android:name="android.intent.category.LAUNCHER" /> 
</intent-filter> 
</activity> 
<activity 
android:name=".RunBackup" 
android:label="@string/app_name" > 
<intent-filter> 
<action android:name="com.peter.databasetest.RUNBACKUP" /> 

<category android:name="android.intent.category.DEFAULT" /> 
</intent-filter> 
</activity> 
<activity 
android:name=".CheckSDDB" 
android:label="@string/app_name" > 
<intent-filter> 
<action android:name="android.intent.action.CHECKSDDB" /> 
<category android:name="android.intent.category.DEFAULT" /> 
</intent-filter> 
</activity> 

@mike yaworski:我從(this,CheckSDDB.class)改了一行。我沒有看到執行中的任何變化。無論如何感謝您的建議。

@DuZi通過從Manifest中刪除Runbackup我得到這個。請參閱下面的日誌。

02-24 07:39:43.745: E/AndroidRuntime(5069): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.peter.databasetest/com.peter.databasetest.CheckSDDB}: android.content.ActivityNotFoundException: Unable to find explicit activity class {com.peter.databasetest/com.peter.databasetest.RunBackup}; have you declared this activity in your AndroidManifest.xml? 
02-24 07:39:43.745: E/AndroidRuntime(5069):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2059) 
02-24 07:39:43.745: E/AndroidRuntime(5069):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084) 
02-24 07:39:43.745: E/AndroidRuntime(5069):  at android.app.ActivityThread.access$600(ActivityThread.java:130) 
02-24 07:39:43.745: E/AndroidRuntime(5069):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195) 
02-24 07:39:43.745: E/AndroidRuntime(5069):  at android.os.Handler.dispatchMessage(Handler.java:99) 
02-24 07:39:43.745: E/AndroidRuntime(5069):  at android.os.Looper.loop(Looper.java:137) 
02-24 07:39:43.745: E/AndroidRuntime(5069):  at android.app.ActivityThread.main(ActivityThread.java:4745) 
02-24 07:39:43.745: E/AndroidRuntime(5069):  at java.lang.reflect.Method.invokeNative(Native Method) 
02-24 07:39:43.745: E/AndroidRuntime(5069):  at java.lang.reflect.Method.invoke(Method.java:511) 
02-24 07:39:43.745: E/AndroidRuntime(5069):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 
02-24 07:39:43.745: E/AndroidRuntime(5069):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
02-24 07:39:43.745: E/AndroidRuntime(5069):  at dalvik.system.NativeStart.main(Native Method) 
02-24 07:39:43.745: E/AndroidRuntime(5069): Caused by: android.content.ActivityNotFoundException: Unable to find explicit activity class {com.peter.databasetest/com.peter.databasetest.RunBackup}; have you declared this activity in your AndroidManifest.xml? 
02-24 07:39:43.745: E/AndroidRuntime(5069):  at android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:1541) 
02-24 07:39:43.745: E/AndroidRuntime(5069):  at android.app.Instrumentation.execStartActivity(Instrumentation.java:1416) 
02-24 07:39:43.745: E/AndroidRuntime(5069):  at android.app.Activity.startActivityForResult(Activity.java:3351) 
02-24 07:39:43.745: E/AndroidRuntime(5069):  at android.app.Activity.startActivityForResult(Activity.java:3312) 
02-24 07:39:43.745: E/AndroidRuntime(5069):  at android.app.Activity.startActivity(Activity.java:3522) 
02-24 07:39:43.745: E/AndroidRuntime(5069):  at android.app.Activity.startActivity(Activity.java:3490) 
02-24 07:39:43.745: E/AndroidRuntime(5069):  at com.peter.databasetest.CheckSDDB.onCreate(CheckSDDB.java:134) 
02-24 07:39:43.745: E/AndroidRuntime(5069):  at android.app.Activity.performCreate(Activity.java:5008) 
02-24 07:39:43.745: E/AndroidRuntime(5069):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079) 
02-24 07:39:43.745: E/AndroidRuntime(5069):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2 023) 
02-24 07:39:43.745: E/AndroidRuntime(5069):  ... 11 more 

新的清單:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
package="com.peter.databasetest" 
android:versionCode="1" 
android:versionName="1.0" > 

<uses-sdk 
android:minSdkVersion="16" 
android:targetSdkVersion="19" /> 

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 

<supports-screens 
android:xlargeScreens="true" 
android:largeScreens="true" 
android:normalScreens="true" 
android:smallScreens="false" /> 

<application 
android:allowBackup="true" 
android:icon="@drawable/ic_launcher" 
android:label="@string/app_name" 
android:theme="@style/AppTheme" >   

<activity 
android:name="com.peter.databasetest.MainActivity" 
android:label="@string/app_name" > 
<intent-filter> 
<action android:name="android.intent.action.MAIN" /> 

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

<activity 
android:name="com.peter.databasetest.Insert" 
android:label="@string/app_name" > 
<intent-filter> 
<action android:name="com.peter.databasetest.INSERT" /> 

<category android:name="android.intent.category.DEFAULT" /> 
</intent-filter> 
</activity> 

<activity 
android:name=".ListDr" 
android:label="@string/app_name" > 
<intent-filter> 
<action android:name="com.peter.databasetest.LISTDR" /> 

<category android:name="android.intent.category.DEFAULT" /> 
</intent-filter> 
</activity> 

<activity 
android:name=".BackupDB" 
android:label="@string/app_name" > 
<intent-filter> 
<action android:name="com.peter.databasetest.BACKUPDB" /> 

<category android:name="android.intent.category.DEFAULT" /> 
</intent-filter> 
</activity> 

<activity 
android:name=".RestoreDB" 
android:label="@string/app_name" > 
<intent-filter> 
<action android:name="android.intent.action.RESTOREDB" /> 
<category android:name="android.intent.category.DEFAULT" /> 
</intent-filter> 
</activity> 

<activity 
android:name=".InputValidation" 
android:label="@string/app_name" > 
<intent-filter> 
<action android:name="android.intent.action.INPUTVALIDATION" /> 
<category android:name="android.intent.category.DEFAULT" /> 
</intent-filter> 
</activity> 

<activity 
android:name=".CheckSDDB" 
android:label="@string/app_name" > 
<intent-filter> 
<action android:name="android.intent.action.CHECKSDDB" /> 
<category android:name="android.intent.category.DEFAULT" /> 
</intent-filter> 
</activity> 

</application> 
</manifest> 

@AtulØ狂熱:RunBackup簡單的拷貝數據庫(數據/數據/ ...)並SD卡。 CheckSDDB檢查SDcard是否可寫,是否存在要複製的主數據庫,並檢查數據庫是否爲空(表爲空)。 在CheckSDDB中滿足OK條件後,調用RunBackup的startActyivity。 RunBackup只需將數據庫複製到SDCard(這就是爲什麼我需要Asynctask),然後返回到MainActivity。 因爲我仍然在學Java,所以我不確定在哪個Activity onCreate上放置Asynctask。
下面是該RunBackup代碼:

package com.peter.databasetest; 

import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileNotFoundException; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.nio.channels.FileChannel; 
import android.app.AlertDialog; 
import android.app.Dialog; 
import android.content.Context; 
import android.content.DialogInterface; 
import android.content.Intent; 
import android.os.AsyncTask; 
import android.os.Environment; 
import android.util.Log; 




    public class RunBackup extends AsyncTask<Void, Void, Integer> {  


     int bkcode;  
     String message; 
     public Context context; 
      protected Dialog alert; 

     public static String PACKAGE_NAME ; 
     public static String FOLDER_NAME = "DBfolder"; 
     public static final String DATABASE_NAME = "UserDB.db"; 
     public static final String DATABASE_BACKUP= "UserDB.db"; 
     public static final String TABLE_NAME = "tableone"; 
     public static final int DB_BACKUP_VERSION= 1; 
      //CHECKING DATABASE RELATED MESSAGES dbcode 

     public static final String NO_DB ="Database does not exist. Backup is not possible"; 
     public static final String EMPTY_DB ="Database is empty.\nNo backup was done."; 
     public static final String UNKN_ERR ="Unknown Error.\nNo backup was done."; 
            //CHECKING SDCARD RELATED MESSAGES sdcode 
     ////////////////////////////////////////////////////////////////////////////////////////////// 
     public static final String UNWR_SDCARD ="Your SDCard must be set to writable. Check the card lock"; 
     public static final String NO_SDCARD ="No SDcard detected. No backup is possible"; 
     /////////////////////////////////////////////////////////////////////////////////////////////// 
     //         BACKUP RELATED MESSAGES bkcode 
     ////////////////////////////////////////////////////////////////////////////////////////////// 
     public static final String BKP_OK = "Backup was SUCCESSFUL.- CheckSDDB";              // 00 
     public static final String FROM_FILE_NFOUND = "Input File not found. Backup not done";        //-15 
     public static final String TO_FILE_NFOUND = "Output File not found. Backup not done";        //-14 
     public static final String TO_FROM_COPY = "Problems Copying Input File to Output. Backup not done"; //-13 
     public static final String FROM_INPUT = "Problems Closing the Input File. Backup not done";      //-12 
     public static final String TO_OUTPUT = "Problems closing the Output File. Backup not done";     //-11 
     public static final String BKP_NOK = "Backup FAILED. "; 

     public static final String TAG = "runBackup"; 

    protected void onPreExecute() { 

    PACKAGE_NAME = context.getApplicationContext().getPackageName() ; 
    } 
     ////////////////////////////////////////////////////// 
     //    START BACKUP TO SDCARD 
     ////////////////////////////////////////////////////// 
    @Override 
    protected Integer doInBackground(Void... params) { 
     bkcode = 0; 
    File sd = Environment.getExternalStorageDirectory(); 
    File data = Environment.getDataDirectory(); 

    /////////////////////////////////////////////////////////////////////////////////////////// 
    //CREATE A FOLDER /mnt/sdcard<packagename>FOLDER_NAME if it does not exist 
    /////////////////////////////////////////////////////////////////////////////////////////// 
    File folder = new File(Environment.getExternalStorageDirectory() 
               + "/" 
               + PACKAGE_NAME 
               + "/" 
               + FOLDER_NAME); 

    if(!folder.exists()) { 
    if (folder.mkdirs()) ; 
    }         
    ////////////////////////////////////////////////////////////////////////// 
    //   GET THE PATH OF THE BACKUP ON THE SDCARD 
    ////////////////////////////////////////////////////////////////////////// 
    File fileBackupDir = new File(Environment.getExternalStorageDirectory() 
               + "/" 
               +PACKAGE_NAME 
               + "/" 
               + FOLDER_NAME 
               +"/" 
               + DATABASE_BACKUP) ; 
    /////////////////////////////////////////////////////////////////////////////////////////////// 
    // IF WE HAVE A BACKUP ON SDCARD, DELETE IT TO MAKE ROOM FOR THE NEW BACKUP 
    ////////////////////////////////////////////////////////////////////////////////////////////// 

    if (fileBackupDir.exists()) { 
    fileBackupDir.delete(); 
    }else { 
    /* DO NOTHING. THIS LOGIC KILLS ME... */ 
    } 
    ///////////////////////////////////////////////////////////// 
     //  GET CURRENT DB PATH FOR THE COPY 
     ///////////////////////////////////////////////////////////// 
    String currentDBPath = "/data/" + PACKAGE_NAME + "/databases/"+ DATABASE_NAME;   
     // GET CURRENT DB PATH FOR THE BACKUP   
     String backupDBPath = "/" + PACKAGE_NAME + "/" +FOLDER_NAME + "/" + DATABASE_BACKUP; 

    File currDB = new File(data, currentDBPath) ;   
    File bkpDB = new File(sd, backupDBPath); 

    FileChannel from = null; 

    try { 
    from = new FileInputStream(currDB).getChannel(); 
     } catch (FileNotFoundException e) { 
      bkcode = -15; 
      message = FROM_FILE_NFOUND ; 
      SendMessageDialog(message); 
     } 
     FileChannel to = null; 
     try { 
      to = new FileOutputStream(bkpDB).getChannel(); 
       } catch (FileNotFoundException e) { 
      bkcode = -14; 
      message = TO_FILE_NFOUND; 
      SendMessageDialog(message); 
     } 
    try { 

      to.transferFrom(from, 0, from.size()); 
     } catch (IOException e) { 
      bkcode = -13; 
      message = TO_FROM_COPY ; 
      SendMessageDialog(message); 
       } 
     try { 
      from.close(); 
     } catch (IOException e) { 
      bkcode = -12; 
      message = FROM_INPUT; 
      SendMessageDialog(message); 
     } 
     try { 
      to.close(); 
     } catch (IOException e) { 
      bkcode = -11; 
      message = TO_OUTPUT; 
      SendMessageDialog(message); 
      } 
     return bkcode; 
     } 
     protected void onPostExecute(Integer retcode, String message) { 

    if(retcode == 0) { 
        message = BKP_OK; 
        SendMessageDialog(message); 

       }else { 
        message = BKP_NOK; 
        SendMessageDialog(message); 
        } 
     } 
    /////////////////////////////////////////////////////////////////// 
    //      DISPLAY MESSAGES 
    ////////////////////////////////////////////////////////////////// 
      public void SendMessageDialog(String message) { 

       AlertDialog.Builder builder = new AlertDialog.Builder(context); 
       if (bkcode == 0) { 
        builder.setIcon(R.drawable.ecg);      /* SET OK ICON */ 
       }else { 
        builder.setIcon(R.drawable.bad);  
       } 
        builder.setTitle("My MESSAGE") 
        .setMessage(message)        // Title of the dialog 
        .setCancelable(true)        // allow the use of Back Button on the hardware 
        .setPositiveButton("OK", new DialogInterface.OnClickListener() { 
         public void onClick(DialogInterface dialog, int id) { 
          returnMain(); 
    }     
      ); 
        alert = builder.create(); 
        alert.show();  
    }    

      /////////////////////////////////////////////////////////////////// 
      //    BACK TO THE CALLING ACTIVITY 
      /////////////////////////////////////////////////////////////////// 
      public void returnMain() { 
       if (alert != null && alert.isShowing()) { 
        alert.dismiss(); 
       } 
       Context ctx = context.getApplicationContext(); 
       Intent intent = new Intent(ctx, MainActivity.class); 
       intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
       ctx.startActivity(intent); 

      } 
} 

@NPE:感謝您的鏈接。我已經經歷了很多次的解釋,但是我仍然不明白爲什麼RunBackup不能按照上面的日誌運行,這取決於鏈接中給出的解釋。

+0

爲什麼您的類Runbackup在您的清單中有一個Activity,當它清楚地擴展AsnycTask類時? – ezcoding

回答

1

這不是完整的解決方案(不知道RunBackup是什麼問題),但這可能是值得注意的事情。

} else if (v == backupDbButton){ 
    startActivity (new Intent(this, CheckSDDB.class)); 

我假設這就是所謂的onClick或其他一些方法,其中vView。問題在於this指的是View(據我所知)。

嘗試修改此:

startActivity (new Intent(this, CheckSDDB.class)); 

向該:

startActivity (new Intent(MainActivity.this, CheckSDDB.class)); 
0

的意圖是操作的抽象描述進行。它可以與startActivity一起使用以啓動一個Activity,broadcastIntent將其發送給任何感興趣的BroadcastReceiver組件,並使用startService(Intent)或bindService(Intent,ServiceConnection,int)與後臺服務進行通信。

如果你想與Intent開始RunBackup那麼你需要擴展Activity類或任何它的子類。

更多信息here

0

的問題是與下面的線,

Intent intent = new Intent(CheckSDDB.this,RunBackup.class); 

RunBackup是的AsyncTask的子類,你的意圖期待的活動。因此例外。因此,作爲@NPE說,創建一個新的活動,你做打電話,

Intent intent = new Intent(CheckSDDB.this,NewActivty.class); 
startActivity(intent); 

,並把你的onCreate()方法調用的AsyncTask。所以,只要Activity被創建,你的RunBackUp就會被觸發。

如果你還可以解釋你想要用你的Asynctask做什麼,這將使我們很容易幫助。

相關問題