試圖執行從另一個類中調用的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不能按照上面的日誌運行,這取決於鏈接中給出的解釋。
爲什麼您的類Runbackup在您的清單中有一個Activity,當它清楚地擴展AsnycTask類時? – ezcoding