Android 应用被 SyncAdapter 杀死
Android App getting killed from SyncAdapter
我有一个 SyncAdapter,它在初始入职流程 (Login/Signup) 中被调用,它处理联系人以查找已经在使用该系统的用户的联系人。
虽然 SyncAdapter 是 运行,但在 特定设备 (Moto G).[= 上几乎每次(10 次中有 9 次)应用程序都会被终止17=]
我最初的想法是,由于设备的可用 RAM 有限,应用程序被终止了。所以,我tried this来证实这个理论:
@Override
public void onPerformSync(Account account, Bundle extras, String authority,
ContentProviderClient provider, SyncResult syncResult) {
ActivityManager.MemoryInfo mi = new ActivityManager.MemoryInfo();
ActivityManager activityManager = (ActivityManager) getContext()
.getSystemService(Context.ACTIVITY_SERVICE);
activityManager.getMemoryInfo(mi);
long availableMegs = mi.availMem / 1048576L;
Log.d(TAG, "Available: " + availableMegs);
Log.d(TAG, "Low Memory: " + mi.lowMemory);
}
事实证明 RAM 可能不是问题,因为日志如下所示:
03-09 11:38:34.444 19193-21339/mypackage.sandbox D/SyncAdapter: Available: 252
03-09 11:38:34.445 19193-21339/mypackage.sandbox D/SyncAdapter: Low Memory: false
进一步在日志中我发现了这个:
03-09 11:38:35.233 865-1610/? I/ActivityManager: Killing 19193:mypackage.sandbox/u0a579 (adj 0): depends on provider com.android.providers.contacts/.ContactsProvider2 in dying proc android.process.acore
应用程序似乎被终止,因为联系人 application/provider 正在终止。
我不确定我在 reddit 上找到的 this thread 有多少相关性。
有什么方法可以防止我的应用程序在仍处于前台时被杀死?
我认为可能的一种方法是,如果我可以推迟通知联系人已被修改。它将防止联系人提供程序启动和被杀死,反过来我的应用程序也不会被杀死。请参考point no 7 on this answer。如果是这样,我该如何推迟通知?
更新:
我什至通过不更改任何联系人来确保推迟对联系人的通知。问题依旧。
感谢任何帮助。
谢谢
也许您运行正在进入TransactionTooLargeException?当与 Intent 捆绑在一起的数据占用 space 超过 1MB 限制时,就会发生这种情况。在你的日志中看到ContactsProvider,可能是因为用户的联系人数据库太大了。这个异常的可悲之处在于它发生在系统级别。您的应用程序在没有机会发现(或:报告)问题的情况下被杀死。捕获此异常的唯一方法是密切关注 logcat。
关于如何防止 SyncAdapter 使您的应用程序崩溃的问题。您是否 运行 在单独的进程中使用 SyncAdapter?如果您只是遵循 sample/tutorial 代码,那么您就是。如果不是,请在 training page 中查找 android:process=":sync"
。当 运行 在单独的进程中时,SyncAdapter 中的崩溃不应影响应用的其余部分。至少不是直接的。您的用户将看到 'app has crashed' 对话框,但其他进程中的应用程序组件 运行ning 将继续 运行ning 正常。
我有一个 SyncAdapter,它在初始入职流程 (Login/Signup) 中被调用,它处理联系人以查找已经在使用该系统的用户的联系人。
虽然 SyncAdapter 是 运行,但在 特定设备 (Moto G).[= 上几乎每次(10 次中有 9 次)应用程序都会被终止17=]
我最初的想法是,由于设备的可用 RAM 有限,应用程序被终止了。所以,我tried this来证实这个理论:
@Override
public void onPerformSync(Account account, Bundle extras, String authority,
ContentProviderClient provider, SyncResult syncResult) {
ActivityManager.MemoryInfo mi = new ActivityManager.MemoryInfo();
ActivityManager activityManager = (ActivityManager) getContext()
.getSystemService(Context.ACTIVITY_SERVICE);
activityManager.getMemoryInfo(mi);
long availableMegs = mi.availMem / 1048576L;
Log.d(TAG, "Available: " + availableMegs);
Log.d(TAG, "Low Memory: " + mi.lowMemory);
}
事实证明 RAM 可能不是问题,因为日志如下所示:
03-09 11:38:34.444 19193-21339/mypackage.sandbox D/SyncAdapter: Available: 252
03-09 11:38:34.445 19193-21339/mypackage.sandbox D/SyncAdapter: Low Memory: false
进一步在日志中我发现了这个:
03-09 11:38:35.233 865-1610/? I/ActivityManager: Killing 19193:mypackage.sandbox/u0a579 (adj 0): depends on provider com.android.providers.contacts/.ContactsProvider2 in dying proc android.process.acore
应用程序似乎被终止,因为联系人 application/provider 正在终止。
我不确定我在 reddit 上找到的 this thread 有多少相关性。
有什么方法可以防止我的应用程序在仍处于前台时被杀死?
我认为可能的一种方法是,如果我可以推迟通知联系人已被修改。它将防止联系人提供程序启动和被杀死,反过来我的应用程序也不会被杀死。请参考point no 7 on this answer。如果是这样,我该如何推迟通知?
更新:
我什至通过不更改任何联系人来确保推迟对联系人的通知。问题依旧。
感谢任何帮助。 谢谢
也许您运行正在进入TransactionTooLargeException?当与 Intent 捆绑在一起的数据占用 space 超过 1MB 限制时,就会发生这种情况。在你的日志中看到ContactsProvider,可能是因为用户的联系人数据库太大了。这个异常的可悲之处在于它发生在系统级别。您的应用程序在没有机会发现(或:报告)问题的情况下被杀死。捕获此异常的唯一方法是密切关注 logcat。
关于如何防止 SyncAdapter 使您的应用程序崩溃的问题。您是否 运行 在单独的进程中使用 SyncAdapter?如果您只是遵循 sample/tutorial 代码,那么您就是。如果不是,请在 training page 中查找 android:process=":sync"
。当 运行 在单独的进程中时,SyncAdapter 中的崩溃不应影响应用的其余部分。至少不是直接的。您的用户将看到 'app has crashed' 对话框,但其他进程中的应用程序组件 运行ning 将继续 运行ning 正常。