不再需要ActivityManager - 不是服务问题

时间:2012-12-26 16:41:44

标签: android android-activity

我正在开发一个开源应用程序(droidwall fork),我遇到的问题之一是当系统重新启动时iptables规则没有正确应用。它适用于大多数Android版本。但是在某些特定的ROMS(CM 10.1)上,它提供了以下logcat

12-26 08:39:27.116 I/ActivityManager(582): 
No longer want dev.ukanth.ufirewall (pid 2297): empty #17

我的代码适用于下面的内容,

private Handler mHandler = new Handler(Looper.getMainLooper());
@Override
public void onReceive(final Context context, final Intent intent) {
    if (Intent.ACTION_BOOT_COMPLETED.equals(intent.getAction())) {
        if (Api.isEnabled(context.getApplicationContext())) {
            final Handler toaster = new Handler() {
                public void handleMessage(Message msg) {
                    if (msg.arg1 != 0) Toast.makeText(context, msg.arg1, Toast.LENGTH_SHORT).show();
                }
            };

            mHandler.post(  
            // Start a new thread to enable the firewall - this prevents ANR
            new Runnable() {
                @Override
                public void run() {
                    if (!Api.applySavedIptablesRules(context.getApplicationContext(), false)) {
                        // Error enabling firewall on boot
                        final Message msg = new Message();
                        msg.arg1 = R.string.toast_error_enabling;
                        toaster.sendMessage(msg);
                        Api.setEnabled(context.getApplicationContext(), false, false);
                    }
                }
            });
            // Start a new thread to enable the firewall - this prevents ANR
        }
        /*Intent i = new Intent(context, StartupService.class);
        i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        context.startService(i);*/
    }

您可以找到我的Api.java课程here

3 个答案:

答案 0 :(得分:8)

  

12-26 08:39:27.116我/ ActivityManager(582):不再需要dev.ukanth.ufirewall(pid 2297):空#17

此日志表示您已达到允许的最大空进程数。 (16是你的最大值)

更多关于来自android doc的empty processes

  

不包含任何活动应用程序组件的进程。保持这种进程活着的唯一原因是缓存目的,以便在下次组件需要运行时改善启动时间。系统通常会杀死这些进程,以便在进程缓存和底层内核缓存之间平衡整个系统资源。

因此,不确定您的日志直接与您的iptables规则问题相关。

答案 1 :(得分:6)

方法onReceived()完成后,系统会假定您已完成BroadcastReceiver并将托管流程设置为最低优先级。我们知道,吐温机处理程序的handleMessage()方法是异步调用的,在onReceived()方法完成后调用,并且无法保证该进程仍然在那里执行回调方法
<登记/> 在大多数Android版本中,在系统启动时运行的进程数量不是很多,并且您的进程(具有最低优先级)有机会保持活动状态,直到调用回调方法handleMessaged(),但使用ROMS( CM 10.1),可能有那么多进程正在运行,系统必须杀死较低优先级的进程以释放资源,以便更高优先级的进程可以正常运行,并且您的进程是一个被杀死的好候选者。

我建议您启动一项服务来执行这些异步任务,这会使您的进程具有更高的优先级(默认情况下服务进程优先级,或者您可以使用startForeground()方法获取前台进程优先级)

答案 2 :(得分:0)

也许你可以使用mHandler.post一段时间来测试你的情况,比如20秒?