2016-10-15 6 views
-1

私はMainActivityから始めて、アプリが殺されたり閉じたりしていないとうまくいきます。しかし、アプリが殺されたり閉じたりして電話がスリープ状態になると、それはうまく動作しません。もしもアプリが殺されてもalarmmanagerを生かしておいてください

アプリケーション/クローズ+電話睡眠を殺した=アラームが

のApp殺し/上+画面を閉じて停止する=アラームが細かい

のAppライブ+電話睡眠を作品=アラームが正常に動作します

Iアプリが殺されて電話が寝ていてもアラームが必要です。

AlarmLocation.class:

public void onReceive(Context context, Intent intent) { 

    PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE); 
    PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "My WakeLock"); 
    wl.acquire(); 

    Log.i("ALARM","ID: "+id); 
    setAlarm(context); 

    //job ends 
    wl.release(); 
} 


public void setAlarm(Context context){ 
    Log.i("SERVICE","ALARM"); 
    AlarmManager am =(AlarmManager) context.getSystemService(Context.ALARM_SERVICE); 
    Intent i = new Intent(context, AlarmLocation.class); 
    id++; 
    PendingIntent pi = PendingIntent.getBroadcast(context, id, i, PendingIntent.FLAG_UPDATE_CURRENT); 
    cancelAlarm(context); 
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 
      am.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP,System.currentTimeMillis()+1000*60*1,pi); 
      Log.i("ALARM","M"); 
     }else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { 
        am.setExact(AlarmManager.RTC_WAKEUP,System.currentTimeMillis()+1000*60*1,pi); 
      Log.i("ALARM","KITKAT"); 
     } else { 

      am.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(),1000*60*1,pi); 

     } 


} 

public void cancelAlarm(Context context){ 
    Intent intent = new Intent(context, AlarmLocation.class); 
    PendingIntent pi = PendingIntent.getBroadcast(context, id-1, intent, 0); 
    AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); 
    alarmManager.cancel(pi); 
} 

サービス:MainActivityで

private AlarmLocation al= new AlarmLocation(); 

@Nullable 
@Override 
public IBinder onBind(Intent intent) { 
    return null; 
} 

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
    Log.i("SERVICE","OSM"); 
    NotificationCompat.Builder notify = new NotificationCompat.Builder(this) 
      .setSmallIcon(R.drawable.cast_ic_notification_small_icon) 
      .setContentTitle("TITLE") 
      .setContentText("TEXT"); 
    startForeground(1,notify.build()); 

    al.setAlarm(this); 
    super.onStartCommand(intent, flags, startId); 
    return START_STICKY; 
} 

@Override 
public void onStart(Intent intent, int startId) { 
    Log.i("SERVICE","OS"); 
    //al.setAlarm(this); 
    super.onStart(intent, startId); 
} 

@Override 
public void onCreate() { 

    super.onCreate(); 
} 

@Override 
public void onDestroy() { 

    Log.i("SERVICE","DESTROYED"); 
    super.onDestroy(); 
} 

startService(new Intent(this,LocationChecker.class)); 

答えて

0

それは少し厄介です。

これはあなたが必要とするサービスです。

Intent intent = new Intent(MainActivity.this, NotificationService.class); 
PendingIntent pintent = PendingIntent.getService(MainActivity.this, 0, intent, 0); 
AlarmManager alarm = (AlarmManager)getSystemService(Context.ALARM_SERVICE); 
alarm.setRepeating(AlarmManager.RTC_WAKEUP, (cal.getTimeInMillis()/interval)*interval+interval, interval, pintent); 

とのAndroidManifest.xmlに振動を有効にすることを忘れないでください:あなたはAlarmManagerを開始すべきMainActivityのOnCreateの機能で

public class NotificationService extends Service { 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     synchronized (this) { 
      NotificationCompat.Builder mBuilder=new NotificationCompat.Builder(this) 
        .setSmallIcon(R.drawable.ic_launcher) 
        .setContentTitle(title) 
        .setContentText(text); 
      if (isSound) 
       mBuilder.setDefaults(Notification.DEFAULT_SOUND | Notification.DEFAULT_VIBRATE); 
      NotificationManager mNotificationManager=(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); 
      mNotificationManager.notify(1, mBuilder.build()); 
     } 
     return START_NOT_STICKY; 
    } 

    @Override 
    public IBinder onBind(Intent intent) { 
     //TODO for communication return IBinder implementation 
     return null; 
    } 
} 

<uses-permission android:name="android.permission.VIBRATE"/> 
関連する問題