2012-07-26 79 views
0

我的应用程序与创建MyApplication extends ApplicationAsyncTask和应用程序的生命周期?

开始我必须通过报警,当运行完(获取GPS位置)服务,我开始AsyncTask从该服务做同步与我的服务器上的后台运行的服务。

这是我的理解:

  1. 只有一个Application可以在Android操作系统同时运行。我正在谈论MY应用程序的实例。所以,我无法从同一个软件包中运行2个Application对象实例。
  2. 如果我看到消息我登录Application.onCreate()这意味着操作系统关闭我的应用程序。
  3. 服务在UI线程上运行,即使不可见。
  4. 如果我从我的服务中产生AsyncTask,并且OS杀死我的应用程序 - AsyncTask get也会终止。我无法控制我的AsyncTask的优雅终止。
  5. 如果我有闹钟预定和应用程序关闭 - 操作系统将发送广播,然后将启动应用程序,然后服务。
  6. 闹钟每5分钟开始一次服务。服务尝试获取最多1分钟的位置,并在完成时启动AsyncTask。所以,我的AsyncTask在下一次服务开始前有4分钟。内部异步任务我做DB访问,这导致像下面列出的问题..

我的理解是正确的?我这样问的理由是因为我从所有运行应用程序的设备写入日志,并且有时会观察到奇怪的行为。大多数设备几乎全天候运行应用程序,但在某些情况下,我始终都会看到Application_Start记录的事件。

有没有什么办法来模拟我的测试系统的应用程序关闭?我做错了什么,需要以不同的方式做?我想我的syncronize后台处理,因为有阅读了大量的数据/写,并阻止..

java.lang.RuntimeException: An error occured while executing doInBackground() 
at android.os.AsyncTask$3.done(AsyncTask.java:299) 
at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273) 
at java.util.concurrent.FutureTask.setException(FutureTask.java:124) 
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307) 
at java.util.concurrent.FutureTask.run(FutureTask.java:137) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569) 
at java.lang.Thread.run(Thread.java:856) 
Caused by: android.database.sqlite.SQLiteCantOpenDatabaseException: unable to open database file (code 14) 
at android.database.sqlite.SQLiteConnection.nativeExecuteForCursorWindow(Native Method) 
at android.database.sqlite.SQLiteConnection.executeForCursorWindow(SQLiteConnection.java:838) 
at android.database.sqlite.SQLiteSession.executeForCursorWindow(SQLiteSession.java:836) 
at android.database.sqlite.SQLiteQuery.fillWindow(SQLiteQuery.java:62) 
at android.database.sqlite.SQLiteCursor.fillWindow(SQLiteCursor.java:143) 
at android.database.sqlite.SQLiteCursor.getCount(SQLiteCursor.java:133) 
at android.database.AbstractCursor.moveToPosition(AbstractCursor.java:196) 
at android.database.AbstractCursor.moveToFirst(AbstractCursor.java:236) 
at com.idatt.data.LockData.Lock(LockData.java:37) 
at com.idatt.common.AsyncProcessor.doInBackground(AsyncProcessor.java:154) 
at com.idatt.common.AsyncProcessor.doInBackground(AsyncProcessor.java:18) 
at android.os.AsyncTask$2.call(AsyncTask.java:287) 
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) 
... 4 more 
android.database.sqlite.SQLiteCantOpenDatabaseException: unable to open database file (code 14) 
at android.database.sqlite.SQLiteConnection.nativeExecuteForCursorWindow(Native Method) 
at android.database.sqlite.SQLiteConnection.executeForCursorWindow(SQLiteConnection.java:838) 
at android.database.sqlite.SQLiteSession.executeForCursorWindow(SQLiteSession.java:836) 
at android.database.sqlite.SQLiteQuery.fillWindow(SQLiteQuery.java:62) 
at android.database.sqlite.SQLiteCursor.fillWindow(SQLiteCursor.java:143) 
at android.database.sqlite.SQLiteCursor.getCount(SQLiteCursor.java:133) 
at android.database.AbstractCursor.moveToPosition(AbstractCursor.java:196) 
at android.database.AbstractCursor.moveToFirst(AbstractCursor.java:236) 
at com.idatt.data.LockData.Lock(LockData.java:37) 
at com.idatt.common.AsyncProcessor.doInBackground(AsyncProcessor.java:154) 
at com.idatt.common.AsyncProcessor.doInBackground(AsyncProcessor.java:18) 
at android.os.AsyncTask$2.call(AsyncTask.java:287) 
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) 
at java.util.concurrent.FutureTask.run(FutureTask.java:137) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569) 
at java.lang.Thread.run(Thread.java:856) 

回答

1
  1. 错误。 Android真的可以同时运行多个进程和线程(和应用程序)。它一直都是这样做的,尽管它通常会给前台应用程序提供比其他更多的CPU。此外,即使我从来没有做过,也可以运行自己的应用程序的多个实例并使用多个进程。但是,如果您的应用程序不应该使用CPU而不在前台(例如游戏),请尝试这样做。没有人希望有一款应用程序可以在电池耗尽时看起来没有运行。

  2. 非常错误。 onCreate的应用程序发生在一开始。如果它多次出现,则表示它已重新启动(由操作系统或用户)。

  3. 正确。对于后台工作,请使用工作线程。

  4. 取决于。如果您的服务是作为前台服务启动的(使用通知),则操作系统将以非常低的优先级将服务查杀。

  5. 取决于您的应用的功能。如果这样做,它会发生这种情况。

  6. 当你创建一个后台服务时,你必须记住,只要OS认为它没有执行重要的任务就允许它关闭它。这就是为什么当发生这种事情时你必须能够恢复工作。

+0

By#1我是指我的应用程序,不是所有的应用程序。我是说,如果在Application.onCreate内部,我记录事件并看到它们 - 这意味着操作系统正在停止我的应用程序 – katit 2012-07-26 17:34:01

+0

查看我更新的帖子。 – 2012-07-26 17:38:34

+0

#1真的让我感到困扰。不关于所有安装的应用程序我只谈论我的申请。如果我想如何运行我的应用程序的多个实例? – katit 2012-07-26 17:44:12

相关问题