0

私はBroadcastReceiverToを使用します:

  • 電話を起こして
  • サービスで音と振動を再生する
  • 表示するActivity

電話が入っていないときにテストすると、すべてがうまく機能しますSleep mode

しかし

受話器入っている時Sleep mode(受話器がロックされていて画面がオフの状態)、画面がONになり、Activityはうまく表示されますが、振動サービスは のOnDestroy直後に動きますonStartCommand

私の BroadcastReceiver:

public class TimerTimeoutBroadcastReceiver extends BroadcastReceiver {

    public void onReceive(Context context, Intent intent) {

        WakeLockManager.acquireWakeLock(context);

        Intent closeDialogs = new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
        context.sendBroadcast(closeDialogs);

        // Open OffAlarm Activity
        StartAlarmOffActivity(context);

        //StartVibrationService
        StartVibrationService(context);
    }

    private void StartAlarmOffActivity(Context context) {
        Intent alarmeActivity = new Intent(context, AlarmScreenOffActivity.class);
        alarmeActivity.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        context.startActivity(alarmeActivity);
    }

    private void StartVibrationService(Context context) {
        Intent playAlarm = new Intent(context, AlarmSoundVibrationService.class);
        context.startService(playAlarm);
    }
}

振動サービスでは:

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    if (intent == null) {
        stopSelf();
        return START_NOT_STICKY;
    }
    play();
    return START_STICKY;
}

@Override
public void onDestroy() {
    super.onDestroy();
    stop();


    WakeLockManager.releaseWakeLock();
}

WakeLockManager で:

PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
mWakeLock = pm.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK | PowerManager.ON_AFTER_RELEASE , "My Tag");

私の質問:

  • OnDestroyスリープモードでサービスを開始したときにすぐに電話をかけないようにするにはどうすればよいですか?
  • このサービスを存続させるために通知を使用する必要がありますか?

編集 1

通知により、サービスをフォアグラウンド サービスとして利用しようとしました。

private void showNotification() {

    CharSequence text = getText(R.string.alarm_vibration_service_started);

    // The PendingIntent to launch our activity if the user selects this notification
    PendingIntent contentIntent = PendingIntent.getActivity(this, 0,
            new Intent(this, AlarmScreenOffActivity.class), 0);

    // Set the info for the views that show in the notification panel.
    Notification notification = null;

    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN) {

        notification = new Notification.Builder(this)
                .setSmallIcon(R.mipmap.ic_launcher)  // the status icon
                .setTicker(text)  // the status text
                .setWhen(System.currentTimeMillis())  // the time stamp
                .setContentTitle(getText(R.string.alarm_vibration_service_label)+" "+mTimerTitle)  // the label of the entry
                .setContentText(text)  // the contents of the entry
                .setContentIntent(contentIntent)  // The intent to send when the entry is clicked
                .build();
    }

    // Send the notification.
    startForeground(Alarm_Vibration_SERVICE_Id,  notification);
}

今私は電話showNotificationをかけましonStartCommandたが、それは私を助けませんでした!

使用後Thread.Sleep(10000)に onStartCommandを使用すると成功し、携帯電話が 10 秒間振動します。Play()

コード:

private void play() {
    stop();
    mVibrator.vibrate(sVibratePattern, 0);

    enableTimeOut();

    mPlaying = true;
}

public void stop() {
    if (mPlaying) {
        mPlaying = false;
        mVibrator.cancel();
    }
    disableTimeOut();
}

private void enableTimeOut() {
    mHandler.sendMessageDelayed(
            mHandler.obtainMessage(TIMEOUT, true),
            1000 * ALARM_TIMEOUT_SECONDS);
}

また、場合によっては上記のコードをテストしました。結果 (10 秒間の振動) は次のとおりです。

  • 失敗: Sleep-Mode =>Activityカウントダウン付き ----start---->TimerTimeoutBroadcastReceiver
  • 失敗: スリープ モード => A Service----start---->TimerTimeoutBroadcastReceiver
  • 失敗: 通常モード => A Service----start---->TimerTimeoutBroadcastReceiver
  • 成功:通常モード =>Activityカウントダウン付き ----開始---->TimerTimeoutBroadcastReceiver

TimerTimeoutBroadcastReceiver最後に、アプリから始めたいのですServiceが、この問題が私を混乱させました!

4

1 に答える 1

0

問題は解決しました!本当に私のサービス(および通知も)は正しく機能しましたが、次のコードがonPauseありますActivity

protected void onPause() {
    Intent playAlarm = new Intent(this, AlarmVibrationService.class);
    stopService(playAlarm);
    super.onPause();
}

スリープ モードで開いたonPause直後に ( ) 発生します。Activity理由はわかりませんが、サービスが停止します。今、私は上記のコードを削除し、問題は解決しました...

于 2016-03-02T09:59:58.223 に答える