没有连接到充电器时更慢的android?

时间:2014-11-22 17:42:36

标签: java android multithreading android-activity

我正在尝试开发简单的Android应用程序,它使用http客户端监视指定的URL,一旦满足定义的条件,它就应该执行通知操作。

我有一个活动启动单独的线程并通过静态值引用它。 (当重新创建活动时,我会在非空的情况下学习参考,以确定子线程是否已经启动)。在这个子线程中,我有while循环,它从url获取json数据并解析它。

我注意到奇怪的行为(也许是因为我是android开发新手)。一旦应用程序在前台,它工作得非常快,当android设备进入睡眠模式时,它不会经常执行请求。 (也许一些能源安全政策?)。最奇怪的是,一旦我通过usb电缆将手机连接到计算机以便快速工作(即使应用程序在后台,手机有黑屏)。

基于连接的充电器激活/停用应用程序是否有任何关系? 我无法对其进行调试,因为一旦连接电缆就可以正常工作,而且无需连接电脑即可进行调试。

1 个答案:

答案 0 :(得分:1)

问题可能是手机在停止几乎所有活动并降低CPU速度时进入睡眠模式。它用于节省电池。例如Handler.postDelayed()上的计时器无法正常工作(未按时调用)。 这个问题有一个特殊的概念 - 对于需要在睡眠模式下执行的活动,你需要使用 AlarmManager ,参见Scheduling Repeating Alarms

问题是您的应用需要注册 AlarmManager ,然后当手机从睡眠模式唤醒时,它会收到预定的事件。您的应用需要锁定 PowerManager 才能执行活动(在您的情况下,它是从网络下载JSON),您不希望在睡眠模式下被中断执行它们。考虑这个例子:

public class AlarmManagerBroadcastReceiver extends BroadcastReceiver {

    /**
     * This method is called when we are waking up by AlarmManager
     */
    @Override
    public void onReceive(Context context, Intent intent) {
        PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
        PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "pulse app");
        //Acquire the lock
        wl.acquire();

        //You can do the processing here.

        //Release the lock
        wl.release();
    }

    /**
     * Register our app with AlarmManager to start receiving intents from AlarmManager
     */
    public static void setAlarm(Context context)
    {
        int interval = 10; // delay in secs
        AlarmManager am=(AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
        Intent intent = new Intent(context, AlarmManagerBroadcastReceiver.class);
        PendingIntent pi = PendingIntent.getBroadcast(context, 0, intent, 0);
        am.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), interval*1000 , pi);
    }

    /**
     * Unregister the app with AlarmManager, call this to stop receiving intents from AlarmManager
     */
    public static void cancelAlarm(Context context)
    {
        Intent intent = new Intent(context, AlarmManagerBroadcastReceiver.class);
        PendingIntent sender = PendingIntent.getBroadcast(context, 0, intent, 0);
        AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
        alarmManager.cancel(sender);
    }

}

此代码需要 Manifest 文件中的android.permission.WAKE_LOCK权限。

关于 AlarmManager 用法的另一篇文章:Android: How to use AlarmManager

而且:prevent mobile from going into sleep mode when app is running

第一个链接上的文章说,为了这个目的,最好使用同步适配器,但我自己还没有使用它们。