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