2016-10-30 16 views
0

私はしばらくの間、簡単なアラームアプリを作ろうとしていましたが、WakeLockの有無にかかわらず、 )。 AlarmReceiverについてはAndroid AlarmManagerがWakeLock付きでもWakeLockなしでも

public class MainActivity extends AppCompatActivity { 
    public final int sleepRequest = 111; 
    public final int wakeRequest = 222; 

    PendingIntent pendingIntent; 
    AlarmManager manager; 

    // currently no difference between sleeping and waking alarms, nor do the alarms use the selected time 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     Button sleepButton = (Button) findViewById(R.id.sleepButton); 
     sleepButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       createAlarm(sleepRequest); 
      } 
     }); 

     Button wakeButton = (Button) findViewById(R.id.wakeButton); 
     wakeButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       createAlarm(wakeRequest); 
      } 
     }); 
    } 

    public void createAlarm(final int requestCode) { 
     showTimePicker(new Completion() { 
      @Override 
      public void onCompletion(int hour, int minute) { 
       setAlarm(hour, minute, requestCode); 
      } 
     }); 
    } 

    public void showTimePicker(final Completion completion) { 
     Calendar calendar = Calendar.getInstance(); 
     int hour = calendar.get(Calendar.HOUR_OF_DAY); 
     int minute = calendar.get(Calendar.MINUTE); 

     TimePickerDialog timePickerDialog = new TimePickerDialog(this, 
       new TimePickerDialog.OnTimeSetListener() { 
        @Override 
        public void onTimeSet(TimePicker view, int hourOfDay, int minute) { 
         completion.onCompletion(hourOfDay, minute); 
        } 
       }, hour, minute, false); 
     timePickerDialog.show(); 
    } 

    public void setAlarm(int hour, int minute, int requestCode) { 
     Date date = new Date(); 
     Calendar now = Calendar.getInstance(); 
     now.setTime(date); 

     Calendar alarm = Calendar.getInstance(); 
     alarm.setTime(date); 
     alarm.set(Calendar.HOUR_OF_DAY, hour); 
     alarm.set(Calendar.MINUTE, minute); 
     alarm.set(Calendar.SECOND,0); 

     if(alarm.before(now)){ 
      alarm.add(Calendar.DATE,1); 
     } 

     manager = (AlarmManager) getSystemService(ALARM_SERVICE); 
     Intent intent = new Intent(MainActivity.this, AlarmReceiver.class); 
     pendingIntent = PendingIntent.getBroadcast(MainActivity.this, requestCode, intent, 0); 
     manager.setAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, alarm.getTimeInMillis(), pendingIntent); 
    } 
} 

:アラームサービスについては

public class AlarmReceiver extends WakefulBroadcastReceiver { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     Intent service = new Intent(context, AlarmService.class); 
     Log.i("SimpleWakefulReceiver", "Starting service @ " + SystemClock.elapsedRealtime()); 
     startWakefulService(context, service); 
    } 
} 

:これはMainActivityのために私のコードです

public class AlarmService extends IntentService { 
    public AlarmService() { 
     super("AlarmService"); 
    } 

    @Override 
    protected void onHandleIntent(Intent intent) { 
     Log.i("APP", "in onHandleIntent"); 
     Toast.makeText(getApplicationContext(), "Hello world", Toast.LENGTH_SHORT).show(); 
    } 
} 

そして、これはAndroidManifestです:それは達すると

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
package="com.me.app"> 

    <uses-permission android:name="android.permission.WAKE_LOCK" /> 
    <uses-permission android:name="com.android.alarm.permission.SET_ALARM" /> 

    <application 
     android:allowBackup="true" 
     android:icon="@mipmap/ic_launcher" 
     android:label="@string/app_name" 
     android:supportsRtl="true" 
     android:theme="@style/AppTheme"> 

     <receiver 
      android:process=":remote" 
      android:name=".AlarmReceiver"> 
     </receiver> 

     <activity android:name=".MainActivity"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 
       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 

     <service android:name=".AlarmService" /> 

    </application> 

</manifest> 

時間あなたはWakefulBroadcastReceiverが何をするのか混乱している

11-07 20:52:01.106 20764-21883/com.me.app I/APP: in onHandleIntent 
11-07 20:52:03.136 20764-20775/com.me.app W/MessageQueue: Handler (android.os.Handler) {f9c4a9b} sending message to a Handler on a dead thread 
                    java.lang.IllegalStateException: Handler (android.os.Handler) {f9c4a9b} sending message to a Handler on a dead thread 
                     at android.os.MessageQueue.enqueueMessage(MessageQueue.java:543) 
                     at android.os.Handler.enqueueMessage(Handler.java:631) 
                     at android.os.Handler.sendMessageAtTime(Handler.java:600) 
                     at android.os.Handler.sendMessageDelayed(Handler.java:570) 
                     at android.os.Handler.post(Handler.java:326) 
                     at android.widget.Toast$TN.hide(Toast.java:738) 
                     at android.app.ITransientNotification$Stub.onTransact(ITransientNotification.java:11-07 20:52:01.106 20764-21883/com.me.app I/APP: in onHandleIntent 
11-07 20:52:03.136 20764-20775/com.me.app W/MessageQueue: Handler (android.os.Handler) {f9c4a9b} sending message to a Handler on a dead thread 
                    java.lang.IllegalStateException: Handler (android.os.Handler) {f9c4a9b} sending message to a Handler on a dead thread 
                     at android.os.MessageQueue.enqueueMessage(MessageQueue.java:543) 
                     at android.os.Handler.enqueueMessage(Handler.java:631) 
                     at android.os.Handler.sendMessageAtTime(Handler.java:600) 
                     at android.os.Handler.sendMessageDelayed(Handler.java:570) 
                     at android.os.Handler.post(Handler.java:326) 
                     at android.widget.Toast$TN.hide(Toast.java:738) 
                     at android.app.ITransientNotification$Stub.onTransact(ITransientNotification.java:55) 
                     at android.os.Binder.execTransact(Binder.java:453)55) 
                     at android.os.Binder.execTransact(Binder.java:453) 
+0

dozeモードを忘れないでください。https://developer.android.com/training/monitoring-device-state/doze-standby.html – Opiatefuchs

+0

'setAnalWhileIdle'に' setExact'を変更しても違いはありません。私は携帯電話がドーズモードを起動するのに十分長い間もアイドル状態に留まるとは思わない。 (アラームは、ボタンが押されてからわずか数秒で設定されます) – Technicolor

+0

ああ、haventはこれを見ました....あなたは許可が必要です:com.android.alarm.permission.SET_ALARM' – Opiatefuchs

答えて

0

:アラームがオフに行くことになっている、私はこのエラーを取得します。それは画面をオンにしません。それはプロセッサを起動させます。画面をオンにしたい場合は、普通の放送受信機を使用し、WAKELOCKを完全に取る必要があります。WAKELLBroadcastReceiverが取るWAKELOCKは部分的なものです。

+0

私はウェイクロックを追加しようとしましたが、フラグACQUIRE_CAUSES_WAKEUPを使用していますが、有効なウェイクロックレベルを指定する必要があると文句を言います。 – Technicolor

+0

次に、有効なレベルを指定します。それはレベルではない、それはフラグです。あなたはそれをレベルとORする必要があります。スクリーンとキーボードに必要な明るさに応じて、画面をウェイクアップする必要があるレベルはSCREEN_DIM_WAKELOCK、SCREEN_BRIGHT_WAKELOCK、またはFULL_WAKELOCKです。 –

+0

これらの値は非推奨です。 – Technicolor

関連する問題