スリープ&キーガード解除について

2,130 views
Skip to first unread message

hideno...@kyoso.co.jp

unread,
Jan 25, 2013, 1:30:19 AM1/25/13
to android-g...@googlegroups.com
実機はNexus7、Eclipseで開発をしています。
スリープ状態にしておき、決まった時間が経過したらスリープ&キーガード解除して
動き出すアプリを作っています。
スリープ解除やキーガード解除の方法は幾つかサイトを拝見して、USB接続してデ
バッグモードで動かしている分には問題なく動くのですが、USBケーブルを外すとな
ぜか、スリープ解除もせずアプリが動き出しません。
PowerManagerなどはデバッグモードでしか使用できないのでしょうか?
Developerサイトを見ていてもそのような事は書かれていないのですが。
何か原因をご存知の方いましたら教えて下さい。

あの、なかしま

unread,
Jan 25, 2013, 4:39:28 AM1/25/13
to android-g...@googlegroups.com
単純に、WakeLock生成時のフラグが間違ってるだけだと思います。

WakeLock wl = ((PowerManager)getSystemService(Context.POWER_SERVICE)).newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK

| PowerManager.ACQUIRE_CAUSES_WAKEUP

| PowerManager.ON_AFTER_RELEASE, getString(R.string.app_name));


2013年1月25日金曜日 15時30分19秒 UTC+9 hideno...@kyoso.co.jp:

hideno...@kyoso.co.jp

unread,
Jan 25, 2013, 4:57:59 AM1/25/13
to android-g...@googlegroups.com
返信ありがとうございます。
 
Android初心者なので、知識も少なくて困ってます。
コードは以下のようになっています。Handlerプロセス内からスクリーンロック解除
させにいってます。
  Handler Handle = new Handler();
  Handle.postDelayed( Task, 1000 );
     ・・
     ・・
 KeyguardManager.KeyguardLock klock;
 WakeLock wakeLock;

 Runnable Task = new Runnable() {
  public void run() {
   Handle.postDelayed( Task, eCycle );    //! 設定周期毎に起動
   //! スリープ解除
   PowerManager pm = ( PowerManager )getSystemService( POWER_SERVICE );
   wakeLock = pm.newWakeLock( PowerManager.SCREEN_BRIGHT_WAKE_LOCK |
     PowerManager.ACQUIRE_CAUSES_WAKEUP | PowerManager.ON_AFTER_RELEASE, "hoge" );
   wakeLock.acquire();
 
   //! キーガード解除
   KeyguardManager km = ( KeyguardManager )getSystemService( KEYGUARD_SERVICE );
   if ( klock == null ) {
    klock = km.newKeyguardLock( "hoge" );
   }
   klock.disableKeyguard();       //! キーガード解除
   ・・・所定の処理・・・
 
  }
 };
 
USB接続してデバッグモード状態だと、スリープからやはり復帰して所定の処理を行うの
ですが、USBを外して、スリープにしておいてらスリープから復帰して来ません。
USBを外していてもスリープにしていなければ所定の処理を実行してくれます。
パーミッションなどは勿論、記述しています。
デバッグモードとそれ以外で、何が違うのかわかりません。
 

あの、なかしま

unread,
Jan 25, 2013, 5:03:01 AM1/25/13
to android-g...@googlegroups.com
私もNexus7で試しましたが、想定しているよりすこし復帰が遅かったように思います。
しばらく待ったら、復帰しませんか?

2013年1月25日金曜日 18時57分59秒 UTC+9 hideno...@kyoso.co.jp:

Shigeo Mutoh

unread,
Jan 25, 2013, 9:02:24 AM1/25/13
to android-g...@googlegroups.com
tmhouseこと武藤です。

自分がたまにやってしまうことですが、
Debug.waitForDebugger();
をどこかに書いてませんか?

Mickey.S

unread,
Jan 27, 2013, 11:58:18 PM1/27/13
to android-g...@googlegroups.com
こんにちは、mickeyです

原因が違ったらすみません。
Nexus7は、USB非接続でのスリープ時にDeep sleepに入っているのではないでしょうか。

Nexus7を持っていないのでわからないのですが、端末によっては、
Deep sleep (スリープ時にCPUを停止する)をサポートしている場合があります。

postDelayed()は、CPUが起きている時間しかカウントされません。
端末がDeep sleepに入っている時間はカウントされないので
いつまでたってもHandlerが呼ばれないことになります。

Deep sleep中でもちゃんと指定した時刻にイベントを発生させる (CPUを起こす)ためには、
AlarmManager (アラームの種類はELAPSED_REALTIME_WAKEUPかELAPSED_REALTIME)が有効です。

AlarmManager
http://developer.android.com/reference/android/app/AlarmManager.html

 

hideno...@kyoso.co.jp

unread,
Jan 28, 2013, 7:18:54 PM1/28/13
to android-g...@googlegroups.com
返信ありがとうございます。
いくら待っても復帰しませんでした。
幾つかのサイトを見ても同じやり方をしているので、何か端末側の設定か、固有の問題
でもあるのか、と思っています。

2013年1月25日金曜日 19時03分01秒 UTC+9 あの、なかしま:
私もNexus7で試しましたが、想定しているよりすこし復帰が遅かったように思います。
しばらく待ったら、復帰しませんか?
 
 

hideno...@kyoso.co.jp

unread,
Jan 28, 2013, 7:19:49 PM1/28/13
to android-g...@googlegroups.com
返信ありがとうございます。
 
DebugクラスのAPIは使用していませんので、別の問題かと思われます。
 

2013年1月25日金曜日 23時02分24秒 UTC+9 TM:
tmhouseこと武藤です。

自分がたまにやってしまうことですが、
Debug.waitForDebugger();
をどこかに書いてませんか?

hideno...@kyoso.co.jp

unread,
Jan 28, 2013, 7:29:33 PM1/28/13
to android-g...@googlegroups.com
返信ありがとうございます。
 
もし、DeepSleepだとすると、USB接続でデバッグモードになっている時は起きてくる
という事は、デバッグモード中はDeepSleepにはなっていないという事になるのでしょ
うか。
AlarmManagerを使う方法も試みたのですが、初心者のためいろいろサイトを参考に
してBroadCastRecieverクラスを呼び出す事は出来たのですが、Activityクラスを呼び
出す方法がわからず、断念しました。
呼び出す処理側ではActivityクラスのメソッドが必要なんです。
 
このDeepSleepかどうかはどうかはどこを見ればわかるのでしょうか。

2013年1月28日月曜日 13時58分18秒 UTC+9 Mickey.S:

kacodama

unread,
Jan 28, 2013, 8:01:42 PM1/28/13
to android-g...@googlegroups.com

AlarmManagerを使う方法も試みたのですが、初心者のためいろいろサイトを参考に
してBroadCastRecieverクラスを呼び出す事は出来たのですが、Activityクラスを呼び
出す方法がわからず、断念しました。
呼び出す処理側ではActivityクラスのメソッドが必要なんです。


ActivityクラスのInnerClassとして定義すればそのクラスのメソッドは使えるはずです。

ちなみに、onReceive内では少しでも時間のかかる処理をすると、すぐANRが発生してしまいますので、ご注意を。

Mickey.S

unread,
Jan 29, 2013, 12:47:15 AM1/29/13
to android-g...@googlegroups.com
こんにちは、mickeyです


もし、DeepSleepだとすると、USB接続でデバッグモードになっている時は起きてくる
という事は、デバッグモード中はDeepSleepにはなっていないという事になるのでしょ
うか。

「デバッグモード」とは、開発者オプションの「USBデバッグ」のことを言っていますか?
以下の状況なら、「デバッグモード中はDeep sleepになっていない」という事になります。
  • USB接続あり + デバッグモード (USBデバッグ)ON:起きてくる
  • USB接続なし + デバッグモード (USBデバッグ)ON:起きてくる
  • USB接続あり + デバッグモード (USBデバッグ)OFF:起きてこない
  • USB接続なし + デバッグモード (USBデバッグ)OFF:起きてこない

そうではなくて、USB接続=「デバッグモード」といっているなら、
現状では
  • USB接続あり (デバッグモード):起きてくる
  • USB接続なし:起きてこない

と動いていると思うので、「USB接続中はDeep sleepに入らない」と考えられます。


私が知っている中では、以下のような端末がありました。

  1. 端末A
    • USB接続中は、Deep sleepに入らない。
    • USBが接続されていなければ、Deep sleepに入る
  2. 端末B
    • USB接続/未接続にかかわらず、Deep sleepに入る。

Deep sleepに入っているかどうかを調べる方法ですが、
「CPU Spy」というアプリでDeepSleepに入っている時間を確認できそうなので、
アプリが正しく動く時と動かない時とで、比べてみればいいと思います。
↓以下のサイトで使い方が紹介されています。
http://androidlover.net/rootapps/cpu-spy.html

2013年1月29日火曜日 9時29分33秒 UTC+9 hideno...@kyoso.co.jp:

hideno...@kyoso.co.jp

unread,
Jan 29, 2013, 12:51:58 AM1/29/13
to android-g...@googlegroups.com
返信ありがとうございます。
 
USB接続なしの状態ですので、やはりDeepSleep中という事になるのですね。
他の方が書いておられるように、AlarmManager+インナークラスのやり方を
試みてみます。
 

2013年1月29日火曜日 14時47分15秒 UTC+9 Mickey.S:
Message has been deleted
Message has been deleted

hideno...@kyoso.co.jp

unread,
Feb 1, 2013, 3:06:15 AM2/1/13
to android-g...@googlegroups.com
AlarmManagerを用いて、Activityクラスをインナークラスとして定義して、
スリープ復帰を試みてました。
ところが、PowerManagerを生成する所で落ちてしまいます。
このスリープ&キーガードを外した後にActivityクラスのメソッドの必要な処理
があります。
インナークラスとして定義したActiviyクラス内ではPowerManagerは使えない
のでしょうか?
 
public class AlarmEvent extends BroadcastReceiver {
  public Process Proc = new Process();
 
  @Override
  public void onReceive(Context context, Intent intent) {
    // TODO 自動生成されたメソッド・スタブ
    Proc.GetEvent( context );      //! イベント監視処理
  }
 
  public class Process extends Activity {
    public void GetEvent( Context context ) {
    ・・・・・
    ・・・・・
      if ( 条件が一致したら ) {
          PowerManager pm = ( PowerManager )context.getSystemService( POWER_SERVICE );
        ↑この行で落ちます。
    ・・・・・
    ・・・・・
      }
    }
  }
}
 

kacodama

unread,
Feb 1, 2013, 3:28:32 AM2/1/13
to android-g...@googlegroups.com

 
public class AlarmEvent extends BroadcastReceiver {
  public Process Proc = new Process();

Process はActivityの派生クラスなのですよね?
BroadcastReceiver でActivityを生成するのはおかしいです。
本来表示しているActivityがあるのではないですか?
Activityのライフサイクルをよく確認してください。

私が以前作ったときはこんな関係になっていたと思います。
typoとか引数ミスはご容赦ください。

public void class MyActivity extends Activity{

public class AlarmEvent extends BroadcastReceiver {

@Override
  public void onReceive(Context context, Intent intent) {
    GetEvent( context );      //! イベント監視処理
  }
}

AlarmEvent myEvent = new  AlarmEvent ();  // onCreateなどでこのReceiverを登録 

hideno...@kyoso.co.jp

unread,
Feb 1, 2013, 5:19:21 AM2/1/13
to android-g...@googlegroups.com
すいません、おっしゃってる事がよくわかりません。
現状、先ほど書いたソースから少し変えてPowerManagerは使えるようになりました。
context.getSystemService( context.POWER_SERVICE );
             ↓
context.getSystemService( Context.POWER_SERVICE );
でした。
DeepSleepからも起きてきています。
 
最終はこのスリープから起きて「条件が一致したら」内でURLを
起動(chormeの場合とYouTubeの場合あり)ですが、そこで今度は落ちています。
 
     Uri uri = Uri.parse( "http://・・・" );
     Intent intent = new Intent( Intent.ACTION_VIEW, uri );
     context.startActivity( intent );     //! URL起動
知識がないので一つクリアになってもまた次の問題で大変です。。

2013年2月1日金曜日 17時28分32秒 UTC+9 kacodama:

noxi

unread,
Feb 1, 2013, 5:39:55 AM2/1/13
to android-g...@googlegroups.com

noxiです。

Activity継承クラスがきちんと動作するのは

1.AndroidOSが決められたメソッド(onCreateなど)を
2.決められたタイミングで
3.UIスレッドで動作させる

からです。
それ以外の目的でActivityを継承するのはただの無駄、という話です。
自分でActivityのクラスをnewしても動作に必要な要素が空なので動きません。

ActivityのstartActivityメソッドはContextクラスも持っています。
そっちを使う必要があります。

--
このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。
このグループから退会し、メールの受信を停止するには、android-group-j...@googlegroups.com にメールを送信します。
このグループに投稿するには、android-g...@googlegroups.com にメールを送信してください。
http://groups.google.com/group/android-group-japan?hl=ja からこのグループにアクセスしてください。
その他のオプションについては、https://groups.google.com/groups/opt_out にアクセスしてください。
 
 

hideno...@kyoso.co.jp

unread,
Feb 3, 2013, 7:14:53 PM2/3/13
to android-g...@googlegroups.com, android.w...@gmail.com
すいません、舌足らずでした。
現在、Activityクラスは生成していません。
BroadcastReceiverクラス内だけで処理しています。
OnReceive()に渡ってきたcontextを使ってPowerManagerなどを使用しています。
ただ、以前Handlerで呼ばれたプロセス内でURLの起動をしていたのですが、その
時は動作はしていましたが、現在はBroadcastReceiverクラス内で、contextを使っ
てURL起動してみたら、動作せずに落ちてしまいます。
未だにこのcontextというのがいまいちよくわかっていません。
 

2013年2月1日金曜日 19時39分55秒 UTC+9 noxi:

hideno...@kyoso.co.jp

unread,
Feb 3, 2013, 8:49:29 PM2/3/13
to android-g...@googlegroups.com
URLの起動は出来るようになりました。どうやらsetFlags()でFLAG_ACTIVITY_NEW_TASKを
指定してやらないといけないという事のようです。
 
ところが、不可思議な動きをしています。
URLというのはYouTubeなのですが、2つの動画を一定時間毎にトグルに再生させようとしてる
のですが、2回目までは再生がうまくいきますが、3回目が再生されずに2回目の動画再生停止
の状態のままになってしまいます。で、時間が経過して4回目になると再び再生します。
 
public class AlarmEvent extends BroadcastReceiver {
  public void onReceive(Context context, Intent intent) {
    ・・・・・
    String url;
    if (条件一致) {  // 動画1
    } else {             // 動画2
    }
    Uri uri = Uri.parse( url );

    Intent intent = new Intent( Intent.ACTION_VIEW, uri );
    intent.setFlags( Intent.FLAG_ACTIVITY_NEW_TASK );

    context.startActivity( intent );     //! URL起動
    ・・・・・
  }
}
 
動画1(再生)→動画2(再生)→動画1(再生せず動画2の停止のまま)→動画1(再生)・・
という動きになってしまいます。
YouTubeアプリの挙動が読めないので、なぜこんな動きになるのかが、わかりません。
何かやはり必要な処理が欠けているのでしょうか?
 
 

kacodama

unread,
Feb 3, 2013, 8:58:30 PM2/3/13
to android-g...@googlegroups.com, android.w...@gmail.com
落ちてしまう、ということは、例外が発生しているのではないですか?
Logcatを確認してください。
例外トレースを見れば、たいていのことは解決できます。

hideno...@kyoso.co.jp

unread,
Feb 3, 2013, 11:49:13 PM2/3/13
to android-g...@googlegroups.com, android.w...@gmail.com
既に投稿していますが、その問題はクリアしています。
今はアクティビティ(YouTube)の起動が思うようにいかないという面です。
前の投稿で間違いがありました。
現状の再生の動きは以下のような現象になっています。
 
動画1(再生)→動画2(再生)→動画1(再生せず動画2の停止のまま)→動画2(再生)・・

2013年2月4日月曜日 10時58分30秒 UTC+9 kacodama:
Reply all
Reply to author
Forward
0 new messages