Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/193.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何保持android手机的CPU始终处于唤醒状态?_Android_Android Intent_Broadcastreceiver_Alarmmanager_Intentservice - Fatal编程技术网

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

如何保持android手机的CPU始终处于唤醒状态?,android,android-intent,broadcastreceiver,alarmmanager,intentservice,Android,Android Intent,Broadcastreceiver,Alarmmanager,Intentservice,我已经坚持了好几天了。我需要每分钟执行一个函数。此功能从应用程序向服务器进行POST呼叫,并每分钟传输用户的位置。位置坐标传输几个小时,但是,几个小时后,位置坐标传输到服务器会自行停止。我正在使用WakefulBroadcastReceiver和IntentService来确保CPU保持清醒。我还利用Alarm来确保每分钟都执行该功能 这就是我的WakefulBroadcastReceiver的外观: public class SimpleWakefulReceiver extends Wake

我已经坚持了好几天了。我需要每分钟执行一个函数。此功能从应用程序向服务器进行POST呼叫,并每分钟传输用户的位置。位置坐标传输几个小时,但是,几个小时后,位置坐标传输到服务器会自行停止。我正在使用WakefulBroadcastReceiver和IntentService来确保CPU保持清醒。我还利用Alarm来确保每分钟都执行该功能

这就是我的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);
  }
}
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();

  }
 }
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);
    }
 }
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
这就是我的IntentService的外观:

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);
  }
}
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();

  }
 }
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);
    }
 }
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
这就是我的报警类的外观:

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);
  }
}
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();

  }
 }
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);
    }
 }
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
这就是每分钟都需要执行的函数(名为updateadata())的样子:

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);
  }
}
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();

  }
 }
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);
    }
 }
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
public void UpdateData(){
最终布尔标志=真;
Log.i(“内部更新数据”、“内部更新数据”);
Thread Thread=新线程(new Runnable(){
@凌驾
公开募捐{

对于(int i=0;i首先,您的SimpleWakefulService看起来不是很wakefull,它应该是WakeLock,但它不是。例如,此类服务的示例如下所示:

下一件事是更新函数。它是在获取部分唤醒锁的上下文中调用的,但其中的线程是异步执行的,这意味着也是在释放唤醒锁之后。这就是导致问题的原因


解决方案是从更新函数中移动线程代码(不需要线程)要唤醒上述链接中的WikefulIntentService。

我确信我会尽快卸载此类应用程序,因为它会很快吸干我的电池。我还能做些什么来每分钟获取用户的位置?非常感谢您的回复marcinj。我将实施它。如果您能查看编辑,我将非常感谢您(在问题的底部)和进一步的指导。@User11012 android可能会终止您的服务,您的实现非常占用资源-您一直保持wakelock,一旦不再需要,您应该立即释放wakelock。这就是为什么您应该遵循指南,这意味着使用AlarmManager每隔几分钟发布一次广播,然后从此广播调用WakefulIntentService。我应该做哪些更改,以便每1分钟发布一次广播(后调用)。此外,我是否只需要使用AlarmReceiver.java和WakefulIntentService.java,或者我还需要包括您在“demo”文件夹中编写的三个类。此外,需要每分钟执行的代码,我应该在何处添加这些代码。最重要的是,请原谅我提出的这些基本问题,我是一名新手开发人员,请尝试向像您这样的伟大人物学习开发。@User11012抱歉,我不太明白-您应该按照演示中的代码进行操作,即,时间间隔在AppListener.java中设置。