Может ли IntentService вывести из спячки экран телефона?

Ответить
developer100
Сообщения: 2
Зарегистрирован: 28 июн 2014, 01:51

Может ли IntentService вывести из спячки экран телефона?

Сообщение developer100 » 29 июн 2014, 20:01

Можно ли из сервиса (background) вывести из спячки телефон на нужное (для какой-либо задачи) время?

Делаю так:
В активити при нажатии на кнопку запускаем IntentService сервис.
(Как пользователь перевожу телефон в спячку)
Сервис включает PowerManager.PARTIAL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP ) (СPU и экран) на время, пока работает onHandleIntent(...).

Не включает. В чем причина?

AndroidManifest.xml

Код: Выделить всё

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.survey.powermanagerservice" 
    android:versionCode="1" 
    android:versionName="1.0" > 
 
    <uses-sdk 
        android:minSdkVersion="10" 
        android:targetSdkVersion="10" /> 
      <uses-permission android:name="android.permission.WAKE_LOCK"/> 
     
    <application 
        android:debuggable="true"         
        android:allowBackup="true" 
        android:icon="@drawable/ic_launcher" 
        android:label="@string/app_name" 
        android:theme="@style/AppTheme" > 
        <activity 
            android:name="com.survey.powermanagerservice.MainActivity" 
            android:label="@string/app_name" > 
            <intent-filter> 
                <action android:name="android.intent.action.MAIN" /> 
 
                <category android:name="android.intent.category.LAUNCHER" /> 
            </intent-filter> 
        </activity> 
         
    <service android:name=".MyPowerService" android:exported="true"></service>         
    </application> 
 
</manifest>


MainActivity.java

Код: Выделить всё

import android.net.Uri; 
import android.os.Bundle; 
import android.app.Activity; 
import android.content.Context; 
import android.content.Intent; 
import android.util.Log; 
import android.view.Menu; 
import android.view.View; 
import android.widget.Button; 
 
public class MainActivity extends Activity { 
 
    static Button btnStartPowerService; 
     
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.main); 
         
        btnStartPowerService=(Button) findViewById(R.id.button1); 
        btnStartPowerService.setOnClickListener(new View.OnClickListener() { 
 
        @Override 
        public void onClick(View v) { 
            try { 
                Thread.sleep(2*1000); 
            } catch (InterruptedException e) { 
                // TODO Auto-generated catch block 
                e.printStackTrace(); 
            }     
            Context AppContext = getApplicationContext(); 
            Intent PowerIntent = new Intent(AppContext,MyPowerService.class); 
            //AppContext.startService(PowerIntent); 
            MyPowerService.startWIS(AppContext, PowerIntent); 
        } 
    });     
    } 
 
    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
        // Inflate the menu; this adds items to the action bar if it is present. 
        getMenuInflater().inflate(R.menu.main, menu); 
        return true; 
    } 
} 
MyPowerService.java

Код: Выделить всё

import android.app.IntentService; 
import android.content.Context; 
import android.content.Intent; 
import android.os.PowerManager; 
import android.os.PowerManager.WakeLock; 
import android.util.Log; 
 
public class MyPowerService extends IntentService { 
 
private static final String NAME = MyPowerService.class.getName() + ".Lock"; 
private static volatile WakeLock lockStatic = null;     
 
public MyPowerService() { 
super("MyPowerService"); 
setIntentRedelivery(true);     
// TODO Auto-generated constructor stub 
}  
public MyPowerService(String name) { 
super(name); 
setIntentRedelivery(true);     
// TODO Auto-generated constructor stub 
} 
 
synchronized private static PowerManager.WakeLock getLock(Context context) { 
if (lockStatic == null) { 
PowerManager mgr = (PowerManager) context 
.getSystemService(Context.POWER_SERVICE); 
lockStatic = mgr.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK |  
PowerManager.ACQUIRE_CAUSES_WAKEUP, NAME); 
lockStatic.setReferenceCounted(true); 
} 
return (lockStatic); 
} 
 
public static void startWIS(Context ctxt, Intent i) { 
getLock(ctxt.getApplicationContext()).acquire(); 
ctxt.startService(i); 
} 
 
@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
PowerManager.WakeLock lock = getLock(this.getApplicationContext()); 
 
if (!lock.isHeld() || (flags & START_FLAG_REDELIVERY) != 0) {  
lock.acquire(); 
} 
super.onStartCommand(intent, flags, startId); 
return (START_REDELIVER_INTENT); 
} 
@Override 
protected void onHandleIntent(Intent intent) { 
try { 
Thread.sleep(10*1000); 
} catch (InterruptedException e) { 
// TODO Auto-generated catch block 
e.printStackTrace(); 
} finally { 
PowerManager.WakeLock lock = getLock(this.getApplicationContext()); 
if (lock.isHeld()) lock.release(); 
} 
 
} 
 
} 

Аватара пользователя
altwin
Сообщения: 1951
Зарегистрирован: 13 ноя 2013, 14:46

Re: Может ли IntentService вывести из спячки экран телефона?

Сообщение altwin » 01 июл 2014, 09:45

ну вообще если установленны ПО для экономии заряда от производителя - они могут требовать от пользователя руками разрешить вам выводить телефон из сна. А вообще вот вроде похожая тема: http://stackoverflow.com/questions/1474 ... ock-device
Изображение

Ответить