无法实例化应用程序java.lang.RuntimeException:…BackupDB无法强制转换为android.app.application

无法实例化应用程序java.lang.RuntimeException:…BackupDB无法强制转换为android.app.application,java,android,android-intent,Java,Android,Android Intent,舱单:(部分视图) MainActivity,程序立即终止并在日志中发出消息。 它应该已经开始显示按钮来选择继续执行的选项。 在对这个论坛进行了几天的研究之后,我发现一些帖子建议将BackupDb放在清单中的应用程序中。 完成后,我在日志中看到了消息。 在用尽我的研究场地之后,我想知道可能存在什么问题以及如何解决它 舱单:(部分视图) 备份数据库:将数据库复制到SD卡 package com.peter.databasetest; import java.io.File; import ja

舱单:(部分视图) MainActivity,程序立即终止并在日志中发出消息。 它应该已经开始显示按钮来选择继续执行的选项。 在对这个论坛进行了几天的研究之后,我发现一些帖子建议将BackupDb放在清单中的应用程序中。 完成后,我在日志中看到了消息。
在用尽我的研究场地之后,我想知道可能存在什么问题以及如何解决它

舱单:(部分视图)

备份数据库:将数据库复制到SD卡

  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.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import com.peter.databasetest.DBAdapter;

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

    DBAdapter db;
    intrc= -10;
    intretcode;
    intchk;
    Stringmessage;
    String mypackage;
    public Context context; 
    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 BKP_OK = "Backup was SUCCESSFUL.";
    public  static final  String BKP_NOK = "Backup FAILED. ";

    @Override 
    protected void onPreExecute() {
    //  GET PACKAGE NAME
    mypackage = context.getApplicationContext().getPackageName() ;
    }
    //     START BACKUP TO SDCARD

    @Override
    protected Integer doInBackground(Void... params) {

    //    DOING BACKUP

    Log.i("00000" , "STARTING BACKUP...BACKUP ");
    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()   
    + "/"
    + mypackage 
    + "/" 
    + FOLDER_NAME);
    if(!folder.exists()) {
    if (folder.mkdirs()) ;
    }                                   

    // GET THE PATH OF THE BACKUP ON THE SDCARD

    FilefileBackupDir = new File(Environment.getExternalStorageDirectory() 
    + "/"
    +mypackage 
    + "/"
    + 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 */
    } 
    //   GET CURRENT DB PATH FOR THE COPY         
    String currentDBPath = "/data/" + mypackage  + "/databases/"+ DATABASE_NAME;         
    //   GET CURRENT DB PATH FOR THE BACKUP          
    String backupDBPath =  "/" + mypackage  + "/"  +FOLDER_NAME + "/" + DATABASE_BACKUP; 

    FilecurrDB  = new File(data,  currentDBPath)  ;         
    FilebkpDB   = new File(sd,  backupDBPath);

    FileChannel from = null;
    try {
    from = new FileInputStream(currDB).getChannel();
    } catch (FileNotFoundException e) {
    e.printStackTrace();
    }
    FileChannel to = null;
    try {
    to = new FileOutputStream(bkpDB).getChannel();
    } catch (FileNotFoundException e) {
    e.printStackTrace();
    }   
    try {
    to.transferFrom(from, 0, from.size());
    } catch (IOException e) {
    e.printStackTrace();
    }   
    try {
    from.close();
    } catch (IOException e) {
    e.printStackTrace();
    }
    try {
    to.close();
    } catch (IOException e) {
    e.printStackTrace();
    }
    retcode = 0;

    returnretcode;          
    //  end DoInBackgroung

    protectedvoid onPostExecute(Integer retcode, String message) {
    if(retcode == 0) {
    message = BKP_OK;
    SendMessageDialog(message);
    }else {
    message = BKP_NOK;
    SendMessageDialog(message);
    }
    }  
    public  void SendMessageDialog(String message) {
    if  (message == BKP_OK ) {   
    AlertDialog.Builder builder = new AlertDialog.Builder(context); 
    builder.setTitle("My Database")
    .setMessage(message)      // Title of the dialog 
    .setCancelable(true)     // Does  allow the use of Back Button on the hardware
    .setIcon(R.drawable.ecg)//  da picture
    .setPositiveButton("OK", new DialogInterface.OnClickListener() {
    public  void  onClick(DialogInterface dialog, int id) { 
    dialog.dismiss();
    dialog.cancel(); 
    }                 
    });
    final AlertDialog alert = builder.create(); 
    alert.show();        
    }else {
    AlertDialog.Builder builder = new AlertDialog.Builder(context);

    builder.setTitle("My Database")
    .setMessage(message)      // Title of the dialog 
    .setCancelable(true)     // Does  allow the use of Back Button on the hardware
    .setIcon(R.drawable.bad)//  da picture
    .setPositiveButton("OK", new DialogInterface.OnClickListener() {
    public  void  onClick(DialogInterface dialog, int id) { 
    dialog.dismiss();
    dialog.cancel(); 
    }                 
    });
    final AlertDialog alert = builder.create();
    alert.show();
    }
    }
    }
评论: 我从应用程序中删除了BackupDb,并将其恢复为活动

<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>  

问题是在清单文件中,您正在将application:name设置为te BackupDB类,并且该类只是一个异步任务,而不是应用程序

从“安卓:名称”的解释中可以看出:

实现总体功能的类的可选名称
此软件包的android.app.Application。[字符串]


问题是在清单文件中,您正在将application:name设置为te BackupDB类,并且该类只是一个异步任务,而不是应用程序

从“安卓:名称”的解释中可以看出:

实现总体功能的类的可选名称
此软件包的android.app.Application。[字符串]


android:name=“com.peter.databasetest.BackupDB”>这里你是在对android说你的类BackupDP扩展了应用程序,是真的吗?我不知道基于什么他们建议你引用清单文件中的
BackupDB
作为应用程序名,但考虑到
BackupDB
是一个异步任务,它肯定不应该在那里。android:name=“com.peter.databasetest.BackupDB”>这里你对android说你的类BackupDP扩展了应用程序,是真的吗?我不知道基于什么他们建议你引用清单文件中的
BackupDB
作为应用程序名,但是考虑到
BackupDb
是一个异步任务,它肯定不应该存在。
  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.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import com.peter.databasetest.DBAdapter;

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

    DBAdapter db;
    intrc= -10;
    intretcode;
    intchk;
    Stringmessage;
    String mypackage;
    public Context context; 
    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 BKP_OK = "Backup was SUCCESSFUL.";
    public  static final  String BKP_NOK = "Backup FAILED. ";

    @Override 
    protected void onPreExecute() {
    //  GET PACKAGE NAME
    mypackage = context.getApplicationContext().getPackageName() ;
    }
    //     START BACKUP TO SDCARD

    @Override
    protected Integer doInBackground(Void... params) {

    //    DOING BACKUP

    Log.i("00000" , "STARTING BACKUP...BACKUP ");
    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()   
    + "/"
    + mypackage 
    + "/" 
    + FOLDER_NAME);
    if(!folder.exists()) {
    if (folder.mkdirs()) ;
    }                                   

    // GET THE PATH OF THE BACKUP ON THE SDCARD

    FilefileBackupDir = new File(Environment.getExternalStorageDirectory() 
    + "/"
    +mypackage 
    + "/"
    + 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 */
    } 
    //   GET CURRENT DB PATH FOR THE COPY         
    String currentDBPath = "/data/" + mypackage  + "/databases/"+ DATABASE_NAME;         
    //   GET CURRENT DB PATH FOR THE BACKUP          
    String backupDBPath =  "/" + mypackage  + "/"  +FOLDER_NAME + "/" + DATABASE_BACKUP; 

    FilecurrDB  = new File(data,  currentDBPath)  ;         
    FilebkpDB   = new File(sd,  backupDBPath);

    FileChannel from = null;
    try {
    from = new FileInputStream(currDB).getChannel();
    } catch (FileNotFoundException e) {
    e.printStackTrace();
    }
    FileChannel to = null;
    try {
    to = new FileOutputStream(bkpDB).getChannel();
    } catch (FileNotFoundException e) {
    e.printStackTrace();
    }   
    try {
    to.transferFrom(from, 0, from.size());
    } catch (IOException e) {
    e.printStackTrace();
    }   
    try {
    from.close();
    } catch (IOException e) {
    e.printStackTrace();
    }
    try {
    to.close();
    } catch (IOException e) {
    e.printStackTrace();
    }
    retcode = 0;

    returnretcode;          
    //  end DoInBackgroung

    protectedvoid onPostExecute(Integer retcode, String message) {
    if(retcode == 0) {
    message = BKP_OK;
    SendMessageDialog(message);
    }else {
    message = BKP_NOK;
    SendMessageDialog(message);
    }
    }  
    public  void SendMessageDialog(String message) {
    if  (message == BKP_OK ) {   
    AlertDialog.Builder builder = new AlertDialog.Builder(context); 
    builder.setTitle("My Database")
    .setMessage(message)      // Title of the dialog 
    .setCancelable(true)     // Does  allow the use of Back Button on the hardware
    .setIcon(R.drawable.ecg)//  da picture
    .setPositiveButton("OK", new DialogInterface.OnClickListener() {
    public  void  onClick(DialogInterface dialog, int id) { 
    dialog.dismiss();
    dialog.cancel(); 
    }                 
    });
    final AlertDialog alert = builder.create(); 
    alert.show();        
    }else {
    AlertDialog.Builder builder = new AlertDialog.Builder(context);

    builder.setTitle("My Database")
    .setMessage(message)      // Title of the dialog 
    .setCancelable(true)     // Does  allow the use of Back Button on the hardware
    .setIcon(R.drawable.bad)//  da picture
    .setPositiveButton("OK", new DialogInterface.OnClickListener() {
    public  void  onClick(DialogInterface dialog, int id) { 
    dialog.dismiss();
    dialog.cancel(); 
    }                 
    });
    final AlertDialog alert = builder.create();
    alert.show();
    }
    }
    }
  02-12 07:36:06.015: E/AndroidRuntime(987): FATAL EXCEPTION: main
  02-12 07:36:06.015: E/AndroidRuntime(987): java.lang.RuntimeException: Unable to instantiate application com.peter.databasetest.BackupDB:     
  : com.peter.databasetest.BackupDB cannot be cast to  android.app.Application
  02-12 07:36:06.015: E/AndroidRuntime(987):    at android.app.LoadedApk.makeApplication(LoadedApk.java:501)
  02-12 07:36:06.015: E/AndroidRuntime(987):    at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4124)
  02-12 07:36:06.015: E/AndroidRuntime(987):    at android.app.ActivityThread.access$1300(ActivityThread.java:130)
  02-12 07:36:06.015: E/AndroidRuntime(987):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1255)
  02-12 07:36:06.015: E/AndroidRuntime(987):    at android.os.Handler.dispatchMessage(Handler.java:99)
  02-12 07:36:06.015: E/AndroidRuntime(987):    at android.os.Looper.loop(Looper.java:137)
  02-12 07:36:06.015: E/AndroidRuntime(987):    at android.app.ActivityThread.main(ActivityThread.java:4745)
  02-12 07:36:06.015: E/AndroidRuntime(987):    at java.lang.reflect.Method.invokeNative(Native Method)
  02-12 07:36:06.015: E/AndroidRuntime(987):    at java.lang.reflect.Method.invoke(Method.java:511)
  02-12 07:36:06.015: E/AndroidRuntime(987):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
  02-12 07:36:06.015: E/AndroidRuntime(987):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
  02-12 07:36:06.015: E/AndroidRuntime(987):    at dalvik.system.NativeStart.main(Native Method)
  02-12 07:36:06.015: E/AndroidRuntime(987): Caused by: java.lang.ClassCastException: com.peter.databasetest.BackupDB cannot be cast to android.app.Application
  02-12 07:36:06.015: E/AndroidRuntime(987):    at android.app.Instrumentation.newApplication(Instrumentation.java:982)
  02-12 07:36:06.015: E/AndroidRuntime(987):    at android.app.Instrumentation.newApplication(Instrumentation.java:967)
  02-12 07:36:06.015: E/AndroidRuntime(987):    at android.app.LoadedApk.makeApplication(LoadedApk.java:496)
  02-12 07:36:06.015: E/AndroidRuntime(987):    ... 11 more
<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>  
  02-12 13:00:16.569: W/dalvikvm(30656): threadid=1: thread exiting with uncaught exception (group=0x40a13300)
  02-12 13:00:16.650: E/AndroidRuntime(30656): FATAL EXCEPTION: main
  02-12 13:00:16.650: E/AndroidRuntime(30656): java.lang.RuntimeException: Unable to instantiate activity      ComponentInfo{com.peter.databasetest/com.peter.databasetest.BackupDB}: java.lang.ClassCastException: com.peter.databasetest.BackupDB cannot be cast to android.app.Activity
  02-12 13:00:16.650: E/AndroidRuntime(30656):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1983)
  02-12 13:00:16.650: E/AndroidRuntime(30656):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084)
  02-12 13:00:16.650: E/AndroidRuntime(30656):  at android.app.ActivityThread.access$600(ActivityThread.java:130)
  02-12 13:00:16.650: E/AndroidRuntime(30656):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195)
  02-12 13:00:16.650: E/AndroidRuntime(30656):  at android.os.Handler.dispatchMessage(Handler.java:99)
  02-12 13:00:16.650: E/AndroidRuntime(30656):  at android.os.Looper.loop(Looper.java:137)
  02-12 13:00:16.650: E/AndroidRuntime(30656):  at android.app.ActivityThread.main(ActivityThread.java:4745)
  02-12 13:00:16.650: E/AndroidRuntime(30656):  at java.lang.reflect.Method.invokeNative(Native Method)
  02-12 13:00:16.650: E/AndroidRuntime(30656):  at java.lang.reflect.Method.invoke(Method.java:511)
  02-12 13:00:16.650: E/AndroidRuntime(30656):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
  02-12 13:00:16.650: E/AndroidRuntime(30656):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
  02-12 13:00:16.650: E/AndroidRuntime(30656):  at dalvik.system.NativeStart.main(Native Method)
  02-12 13:00:16.650: E/AndroidRuntime(30656): Caused by: java.lang.ClassCastException: com.peter.databasetest.BackupDB cannot be cast to android.app.Activity
  02-12 13:00:16.650: E/AndroidRuntime(30656):  at android.app.Instrumentation.newActivity(Instrumentation.java:1053)
  02-12 13:00:16.650: E/AndroidRuntime(30656):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1974)
  02-12 13:00:16.650: E/AndroidRuntime(30656):  ... 11 more




>Question:
>Is there any known limitation calling an AsyncTask by way of startActivityForResult? 
>Could this be a factor?