Android App被SyncAdapter杀死

时间:2016-03-09 06:49:49

标签: android android-syncadapter

我有一个SyncAdapter,在初始入门过程(登录/注册)期间被调用,处理联系人以查找已经使用该系统的用户联系人。

当SyncAdapter正在运行时,应用程序几乎每次都被杀死(10次中有9次)特定设备(Moto G)

我最初的想法是,由于设备的可用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可能不是问题,因为Logs看起来像这样:

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

似乎应用程序正在被杀死,因为联系人应用程序/提供程序被杀死了。

我不确定我在reddit上找到的this thread有多大相关。

当我的应用程序仍处于FOREGROUND状态时,有什么方法可以阻止我的应用程序被杀?

我认为可能的一种方式是,我是否可以推迟通知联系人已被修改。它会阻止联系人提供者启动并被杀死,反过来我的应用程序也不会被杀死。请参阅point no 7 on this answer。如果是这样,我该如何推迟通知?

更新

我甚至确保通过不更改任何联系人来延迟向联系人发送通知。问题仍然存在。

感谢任何帮助。 感谢

1 个答案:

答案 0 :(得分:3)

也许你遇到了TransactionTooLargeException?当与Intent捆绑的数据占用的空间超过1MB限制时,就会发生这种情况。在日志中看到ContactsProvider,可能是因为用户的联系人数据库太大。这个例外的可悲之处在于它发生在系统级别。您的应用程序在没有机会捕获(或:报告)问题的情况下被杀死。捕获此异常的唯一方法是密切关注logcat。

关于如何防止SyncAdapter崩溃您的应用的问题。您是在单独的进程中运行SyncAdapter吗?如果你只是按照示例/教程代码那么你就是。如果没有,请在training page中查找android:process=":sync"。在单独的进程中运行时,SyncAdapter中的崩溃不应影响应用程序的其余部分。至少不是直接的。您的用户将看到“应用已崩溃”对话框,但在其他进程中运行的应用组件将继续正常运行。