我的应用程序从创建开始MyApplication extends Application
我有通过警报在后台运行的服务,当服务完成运行(获取 GPS 位置)时,我AsyncTask
从该服务开始与我的服务器同步。
以下是我的理解:
- 在 Android 操作系统中一次
Application
只能运行一个。我说的是我的应用程序的实例。因此,我无法从同一个包中运行我的 Application 对象的 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)