如何保持android手机的CPU始终处于唤醒状态?

我已经坚持了好几天.我需要每分钟执行一次函数.此功能正在从App向服务器发出POST呼叫,并且每分钟都会转移用户的位置.位置坐标将转移几个小时,但是,几个小时后,位置坐标向服务器的转移将自行停止.我正在使用WakefulBroadcastReceiver和IntentService来确保CPU保持唤醒状态.我还利用“警报”来确保该功能每分钟执行一次.

这是我的WakefulBroadcastReceiver的样子:

public class SimpleWakefulReceiver extends WakefulBroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
    // This is the Intent to deliver to our service.
    Intent service = new Intent(context, SimpleWakefulService.class);

    // Start the service, keeping the device awake while it is launching.
    Log.i("SimpleWakefulReceiver", "Starting service @ " +        
    SystemClock.elapsedRealtime());
    startWakefulService(context, service);
  }
}

这是我的IntentService的样子:

public class SimpleWakefulService extends IntentService {
public MainActivity obj;
public Alarm alarm; 
public SimpleWakefulService() {
    super("SimpleWakefulService");
}

@Override
protected void onHandleIntent(Intent intent) {

    boolean flag = true;
        while(flag){
        Log.i("SimpleWakefulService", "Running service ");

        alarm = new Alarm();
        alarm.SetAlarm(SimpleWakefulService.this);
        Log.i("Called alarm.SetAlarm","Called alarm.SetAlarm");

    }
    SimpleWakefulReceiver.completeWakefulIntent(intent);
   // wl.release();

  }
 }

这是我的Alarm类的样子:

public class Alarm extends BroadcastReceiver 
{    
public MainActivity obj;
@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, "");
    wl.acquire();
    obj = new MMMainActivity();
    obj.UpdateData();

    Toast.makeText(context, "Alarm !!!!!!!!!!", Toast.LENGTH_LONG).show(); 
    wl.release();
}

public void SetAlarm(Context context)
{
    Log.i("Inside SetAlarm","Inside SetAlarm");
    AlarmManager am =( AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
    Intent i = new Intent(context, Alarm.class);
    PendingIntent pi = PendingIntent.getBroadcast(context, 0, i, 0);
    am.setInexactRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 1000 * 60 * 1, pi); // Millisec * Second * Minute


}

public void CancelAlarm(Context context)
{
    Intent intent = new Intent(context, Alarm.class);
    PendingIntent sender = PendingIntent.getBroadcast(context, 0, intent, 0);
    AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
    alarmManager.cancel(sender);
    }
 }

这就是需要每分钟执行一次的函数(名为UpdataData()),如下所示:

public void UpdateData() {
    final boolean flag = true;
    Log.i("Inside Update Data", "Inside Update Data");

    Thread thread = new Thread(new Runnable() {
       @Override
        public void run() {

            for(int i=0; i<1; i++){
                try {

                    // Your code goes here
                    if (locationclient != null
                            && locationclient.isConnected()) {
                        loc = locationclient.getLastLocation();
                        lat = loc.getLatitude();
                        lng = loc.getLongitude();

                    }
                try { // Updating the latest location in the UI, just
                            // for convinience.
                        HttpClient httpClient = new DefaultHttpClient();
                        // Creating HTTP Post
                        HttpPost httpPost = new HttpPost(
                                "http://www.mywebsite.com/update");
                        List<NameValuePair> nameValuePair = new ArrayList<NameValuePair>(
                                3);
                        // Building post parameters//
                        // key and value pair

                        Log.i("token", "token" + token);
                        Log.i("Latitude for III POST Call",
                                "Latitude for III POST Call" + lat);
                        Log.i("Longitude for III POST Call",
                                "Longitude for III POST Call" + lng);


                        nameValuePair.add(new BasicNameValuePair("token",
                                token));
                        nameValuePair.add(new BasicNameValuePair("lat",
                                Double.toString(lat)));
                        nameValuePair.add(new BasicNameValuePair("lng",
                                Double.toString(lng)));
                        Log.i("Made UpdateData Post Call",
                                "Made UpdateData Post Call");
                        // Url Encoding the POST parameters
                        try {
                            httpPost.setEntity(new UrlEncodedFormEntity(
                                    nameValuePair));
                        } catch (UnsupportedEncodingException e) {
                            // writing error to Log
                            e.printStackTrace();
                        }

                        // Making HTTP Request
                        try {
                            HttpResponse response = httpClient
                                    .execute(httpPost);

                            // writing response to log
                            Log.d("Http Response:", response.toString());
                            // Your code goes here
                        } catch (IOException e) {
                            // writing exception to log
                            e.printStackTrace();

                        }
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }

            }// loop closed
           }
      });
    thread.start();
    }// UpdateData closed

为什么即使使用了所有这些后,UpdateData()也无法每60秒无限次执行?在这方面的任何帮助将不胜感激.还要注意,UpdateData()每60秒执行一次,持续几个小时,但是一段时间后,它的执行将自行停止,因此位置坐标从App到服务器的传输.

编辑:我已经编辑了SimpleWakefulService,并根据答案之一的建议添加了所需的更改.几个小时后一切正常,但是几个小时后,该服务被自动终止.我相信服务并不是要被杀死的.谁能解释一下吗?
SimpleWakefulService:

public class SimpleWakefulService extends IntentService implements 
OnClickListener,ConnectionCallbacks, OnConnectionFailedListener, 
LocationListener,GooglePlayServicesClient.ConnectionCallbacks,
GooglePlayServicesClient.OnConnectionFailedListener {


public static Location loc;
public static LocationClient locationclient;
public static double lat = 10, lng = 10;
public static String token; 

public Alarm alarm; 
public SimpleWakefulService() {
    super("SimpleWakefulService");

}


@Override
protected void onHandleIntent(Intent intent) {


    //Getting the value of token from another Class
    token = ConfirmToken.uvalue;
    Log.i("WakefulServiceutoken", "WakefulServicutoken" + token);

    PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
    PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "");
    wl.acquire();

        final boolean flag = true;

        while (flag) {
                    try {

                        // Your code goes here
                        if (locationclient != null
                                && locationclient.isConnected()) {
                            loc = locationclient.getLastLocation();
                            lat = loc.getLatitude();
                            lng = loc.getLongitude();

                        }

                      try { // Updating the latest location in the UI, just
                                // for convinience.
                            HttpClient httpClient = new DefaultHttpClient();
                            // Creating HTTP Post
                            HttpPost httpPost = new HttpPost(
                                    "http://www.mywebsite.com/update");
                            List<NameValuePair> nameValuePair = new ArrayList<NameValuePair>(
                                    3);
                            // Building post parameters//
                            // key and value pair
                            Log.i("token", "token" + token);
                            Log.i("Latitude for III POST Call",
                                    "Latitude for III POST Call" + lat);
                            Log.i("Longitude for III POST Call",
                                    "Longitude for III POST Call" + lng);


                            nameValuePair.add(new BasicNameValuePair("token",
                                    token));
                            nameValuePair.add(new BasicNameValuePair("lat",
                                    Double.toString(lat)));
                            nameValuePair.add(new BasicNameValuePair("lng",
                                    Double.toString(lng)));
                                                            // Url Encoding the POST parameters
                            try {
                                httpPost.setEntity(new UrlEncodedFormEntity(
                                        nameValuePair));
                            } catch (UnsupportedEncodingException e) {
                                // writing error to Log
                                e.printStackTrace();
                            }

                            // Making HTTP Request
                            try {
                                HttpResponse response = httpClient
                                        .execute(httpPost);

                                // writing response to log
                                Log.d("Http Response:", response.toString());
                                // Your code goes here
                            } catch (IOException e) {
                                // writing exception to log
                                e.printStackTrace();

                            }
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                    try {
                        Thread.sleep(10000);
                    } catch (Exception e) {

                    }

                }// While closed


    //SimpleWakefulReceiver.completeWakefulIntent(intent);
    //wl.release();

}

@Override
public void onDisconnected() {
    // TODO Auto-generated method stub

}

@Override
public void onLocationChanged(Location arg0) {
    // TODO Auto-generated method stub

}

@Override
public void onProviderDisabled(String arg0) {
    // TODO Auto-generated method stub

}

@Override
public void onProviderEnabled(String arg0) {
    // TODO Auto-generated method stub

}

@Override
public void onStatusChanged(String arg0, int arg1, Bundle arg2) {
    // TODO Auto-generated method stub

}

@Override
public void onConnectionFailed(ConnectionResult result) {
    // TODO Auto-generated method stub

}

@Override
public void onConnected(Bundle arg0) {
    // TODO Auto-generated method stub

}

@Override
public void onConnectionSuspended(int arg0) {
    // TODO Auto-generated method stub

}

@Override
public void onClick(View v) {
    // TODO Auto-generated method stub

}

}

解决方法:

首先,您的SimpleWakefulService看起来不是很唤醒,它应该使用WakeLock,但事实并非如此.此类服务的示例如下:

https://github.com/commonsguy/cwac-wakeful/blob/master/wakeful/src/com/commonsware/cwac/wakeful/WakefulIntentService.java

接下来是更新功能.在需要PARTIAL_WAKE_LOCK的上下文中调用它,但是其中的线程是异步执行的,这也意味着在释放唤醒锁之后.那就是造成问题的原因.

解决方案是将线程代码从更新功能(不需要线程)移至WakefulIntentService,如上面的链接所示.

上一篇:android-在实时应用程序中在后台运行重复任务


下一篇:mongo 数据导入导出方法