我的应用程序从创建 MyApplication 扩展应用程序
开始
我有一个通过警报在后台运行的服务,当服务完成运行(获取 GPS 位置)时,我从该服务启动 AsyncTask
与我的服务器同步。
这是我的理解:
- Android 操作系统中一次只能运行一个
应用程序
。我说的是我的应用程序的实例。因此,我无法让同一个包中的应用程序对象的 2 个实例运行。 - 如果我看到在
Application.onCreate()
中记录的消息,则意味着操作系统关闭了我的应用程序。 - 服务在 UI 线程上运行,即使不可见。
- 如果我从我的服务中生成
AsyncTask
并且操作系统终止了我的应用程序 - AsyncTask 也会终止。我无法控制 AsyncTask 的优雅终止。 - 如果我安排了闹钟但应用程序已关闭 - 操作系统将发送广播,该广播将依次启动应用程序和服务。
- 警报每 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)
最佳答案
错误。 android确实可以同时运行多个进程和线程(和应用程序)。它总是这样做,尽管它通常为前台应用程序提供比其他应用程序更多的 CPU。另外,即使我从未这样做过,也可以运行您自己的应用程序的多个实例并使用多个进程。
但是,如果您的应用程序在不在前台时不应该使用 CPU(例如游戏),请尝试这样做。没有人希望应用程序在看起来根本没有运行的情况下耗尽电池电量。
非常错误。应用程序的 onCreate 发生在开始时。如果多次出现,则表示已重新启动(由操作系统或用户重新启动)。
正确。对于后台工作,请使用工作线程。
取决于。如果您将该服务作为前台服务启动(带有通知),则操作系统将为终止该服务提供非常低的优先级。
取决于您的应用程序的用途。如果它这样做了,就会以这种方式发生。
当您创建后台服务时,您必须记住,只要操作系统认为它没有执行重要任务,就可以将其关闭。这就是为什么发生这种情况时您必须能够恢复工作。
关于java - AsyncTask和Application的生命周期?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11673030/