2012-06-30 3 views
0

У меня есть два вида деятельности в моем приложении. Первое действие приобретает вакелок, который все еще присутствует, даже когда эта деятельность разрушена. Эта активность также устанавливает тревогу, которая запускает второе действие. Я хочу, чтобы второе мероприятие выпустило wakelock, которое было приобретено первой активностью.освобождение wakelock в различной деятельности до того места, где оно было приобретено

Так bassically:

Первая деятельность приобретает wakelock >> Первая активность разрушена >> Wakelock еще приобрела >> canender (сигнал тревоги) открывает новое направление деятельности (вторая активность) >> Второй релизы деятельности wakelock ??

Вопрос в том, как я могу освободить wakelock в другой деятельности, где был приобретен wakelock?

Это код, я использую, чтобы приобрести wakelock в первой деятельности:

WakeLock wl; 
    PowerManager pM = (PowerManager)getSystemService(Context.POWER_SERVICE); 
    wl = pM.newWakeLock(PowerManager.FULL_WAKE_LOCK, "wakeLock"); 
    wl.acquire(); 

Есть ли код я мог бы использовать, чтобы освободить wakelock во втором activty?

+0

почему бы вам не использовать ** Моделирование Singleton ** для этого? – waqaslam

ответ

7

Храните блокировку следа в статической переменной, доступной для обоих видов деятельности. Как это:

class Globals { 
    public static WakeLock wakelock; 
} 

В вашей первой деятельности:

PowerManager pM = (PowerManager)getSystemService(Context.POWER_SERVICE); 
WakeLock wl = pM.newWakeLock(PowerManager.FULL_WAKE_LOCK, "wakeLock"); 
wl.acquire(); 
Globals.wakelock = wl; // Save in a place where it won't go 

// прочь, когда эта активность осуществляется

В вашей второй деятельности:

if (Globals.wakelock != null) { 
    Globals.wakelock.release(); 
    Globals.wakelock = null; // We don't have a wake lock any more 
} 
+0

Вы имели в виду 'if (Globals.wakelock.isHeld()) Globals.wakelock.release();' –

+0

@Mr_and_Mrs_D Um, no. Я этого не сделал. Предоставленный вами код может вызвать исключение NullPointerException. Конечно, есть другие способы сделать это. –

+0

Вы только что отметили нулевую одну строку выше –

1
public class WakeLockManager extends BroadcastReceiver { 

    private static WakeLock mWakeLock; 
    private String LCLT; 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     if (intent.getAction().equals(Consts.WAKELOCK_INTENT)) { 
      Log.v("wakelock", "GOT THE wakelock INTENT"); 
      boolean on = intent.getExtras().getBoolean("on"); 
      if (mWakeLock == null) { 
       PowerManager pm = (PowerManager) context 
         .getSystemService(Context.POWER_SERVICE); 
       mWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, 
         "Breeze WakeLock"); 
      } 
      if (on) { 
       if (!mWakeLock.isHeld()) { 
        mWakeLock.acquire(); 
        Log.v("wakelock", "acquiring wakelock"); 
       } 
      } else { 
       if (mWakeLock.isHeld()) { 
        Log.v("wakelock", "releasing wakelock"); 
        mWakeLock.release(); 
       } 
       mWakeLock = null; 
      } 
     } 
    } 
} 

взгляд по указанному выше коду .. введите его в отдельный c lass file и в вашем манифесте определите его для определенного пользовательского намерения ... теперь этот класс будет реагировать на пользовательские намерения ... просто передайте это намерение, и вы можете включить или выключить wakelock во всем своем приложении, поскольку wakelock static..like это:

public static void setWakeup(boolean status) { 
    Intent wakelock_Intent = new Intent(CUSTOM_INTENT); 
    wakelock_Intent.putExtra("on", status); 
    getActivityReference().sendBroadcast(wakelock_Intent); 
} 

выше будет определено в службе ..
, то мы можем вызвать этот метод из любой точки мира, так как его статические, чтобы изменить процессора wakelock