0

我的应用程序从创建开始MyApplication extends Application

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

以下是我的理解:

  1. 在 Android 操作系统中一次Application只能运行一个。我说的是我的应用程序的实例。因此,我无法从同一个包中运行我的 Application 对象的 2 个实例。
  2. 如果我看到我登录的消息Application.onCreate(),这意味着操作系统关闭了我的应用程序。
  3. 服务在 UI 线程上运行,即使不可见。
  4. 如果我AsyncTask从我的服务中生成并且操作系统杀死了我的应用程序 - AsyncTask 也会终止。我无法控制 AsyncTask 的正常终止。
  5. 如果我安排了警报并且应用程序已关闭 - 操作系统将发送广播,该广播将依次启动应用程序然后服务。
  6. 警报每 5 分钟启动一次服务。服务尝试获取最多 1 分钟的位置,并在完成后启动 AsyncTask。因此,我的 AsyncTask 在下一次服务启动前还有 4 分钟。在异步任务中,我进行数据库访问,这会导致下面列出的问题..

我的理解正确吗?我之所以问这个问题是因为我从所有运行应用程序的设备中写入日志,并且有时会观察到奇怪的行为。大多数设备几乎 24/7 运行应用程序,但在某些设备上我一直看到 Application_Start 记录事件。

有什么方法可以模拟系统关闭应用程序以进行测试吗?我做错了什么,需要以不同的方式做吗?我想同步我的后台处理,因为有很多数据读/写并且它正在阻塞..

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

1 回答 1

1
  1. 错误的 。android 真的可以同时运行多个进程和线程(和应用程序)。它一直都在这样做,尽管它通常为前台应用程序提供比其他应用程序更多的 CPU。此外,即使我从未做过,也可以运行您自己的应用程序的多个实例并使用多个进程。

    但是,如果您的应用程序在不在前台(例如游戏)时不应该使用 CPU,请尝试这样做。没有人希望有一个应用程序在它似乎没有运行时会耗尽电池电量。

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

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

  4. 要看 。如果您将服务作为前台服务启动(带有通知),操作系统将给予服务的终止非常低的优先级。

  5. 取决于你的应用做什么。如果它这样做,它会以这种方式发生。

  6. 当您创建后台服务时,您必须记住,只要操作系统认为它不执行重要任务,就可以将其关闭。这就是为什么当这种事情发生时你必须能够恢复你的工作。

于 2012-07-26T17:30:38.320 回答