簡體   English   中英

當手機進入睡眠狀態時,無法獲得android活動

[英]Cant get android activity to stay on when the phone goes to sleep

我是Android的新手,正在嘗試使用鬧鍾應用程序。 我正在通過AlarmManager啟動活動,只要手機醒着就可以正常工作。 當手機處於睡眠狀態時,它似乎可以正常運行代碼,然后運行onStop功能關閉活動。 我嘗試了WakeLock和Window標志的各種組合,但無濟於事。

但是,如果有幫助,這可以在較舊的電話(2.3)上運行。 任何見解均表示贊賞。

這是“警報”活動的代碼:

package com.myAlarm.android;

import java.text.SimpleDateFormat;
import java.util.Date;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.hardware.Sensor;
import android.hardware.SensorManager;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.media.RingtoneManager;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.os.Vibrator;
import android.preference.PreferenceManager;
import android.util.Log;
import android.view.Gravity;
import android.view.View;
import android.view.View.MeasureSpec;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.view.Window;
import android.view.WindowManager;
import android.view.animation.Animation;
import android.view.animation.LinearInterpolator;
import android.view.animation.TranslateAnimation;
import android.widget.DigitalClock;
import android.widget.FrameLayout;
import android.widget.LinearLayout;
import android.widget.TextClock;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.ImageView;
import com.snoozulooze.android.UtilityFunctions;

@SuppressLint("NewApi")
public class Alarm extends Activity{
    private int timerDelay = 4000;
    private int id;
    private double snoozeInt = 1;
    private TextView clockText;
    private TextView dateText;
    private LinearLayout clockLayout;
    private DatabaseHandler db;
    public static AlarmRow ALARM_DATA;
    private Animation animScroll;
    private SensorManager mSensorManager;
    private ShakeEventListener mSensorListener;
    private Runnable alertLoop;
    private Handler handler;
    private ImageView snooze;

    @Override
    protected void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        turnOnScreen();
        Log.i("ALARM", "on create ran");
        AlarmWakeLock.acquireCpuWakeLock(Alarm.this);
        setContentView(R.layout.activity_alarm);
        mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
        mSensorListener = new ShakeEventListener();   
        handler = new Handler();
        alertLoop = new Runnable() {

            @Override
            public void run() {
                playAlarm();
                handler.postDelayed(this, timerDelay);

            }

        };

        //Create the clock for text clock of digital clock
        LayoutParams clockParams = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
        clockLayout = (LinearLayout)findViewById(R.id.alarmClockLayout);
        dateText = (TextView) findViewById(R.id.alarmClockDateTxt);
        try{
            TextClock tc = new TextClock(Alarm.this);
            tc.setLayoutParams(clockParams);
            tc.setTextColor(getResources().getColor(R.color.white));
            tc.setGravity(Gravity.CENTER);
            clockText = (TextClock) tc;
        }
        catch(Throwable t){
            Log.e("Alarm", t.getMessage());
            DigitalClock dc = new DigitalClock(Alarm.this);
            dc.setLayoutParams(clockParams);
            dc.setTextColor(getResources().getColor(R.color.white));
            dc.setGravity(Gravity.CENTER);
            clockText = (TextView) dc;

        }
        clockLayout.addView(clockText,0);
        UtilityFunctions.assignText(Alarm.this, clockText, "fonts/Roboto-Thin.ttf");
        SimpleDateFormat sdf = new SimpleDateFormat("EEE. LLLL dd");
        String currentDateandTime = sdf.format(new Date());
        dateText.setText(currentDateandTime.toLowerCase());

        clockLayout.post(new Runnable(){
            public void run(){
                float clockHeight = (float) (clockLayout.getHeight()*.35);
                float dateHeight = (float) (clockLayout.getHeight()*.15);
                if (clockHeight > 45){
                    clockHeight = 45;
                    dateHeight = 24;
                }
                clockText.setTextSize(((float) clockHeight));
                dateText.setTextSize(((float) dateHeight));

            }
        });
        //SetupAlarm aSetUp = new SetupAlarm();
        //aSetUp.execute();
        init();

    }

    private void init(){
        db = new DatabaseHandler(this);
        Intent fromIntent = getIntent();
        Bundle bundle = fromIntent.getExtras();
        id = bundle.getInt("id");
        Alarm.ALARM_DATA = db.getAlarmData(id);
        snooze = (ImageView) findViewById(R.id.snoozeAlarmBtn);
        setupUI();
    }

    private void setupUI(){
        String message = Alarm.ALARM_DATA.getMessage();
        if(message != "" && message != null){
            TextView tv = new TextView(Alarm.this);
            tv.setText(message);
            tv.setTextSize(16);
            FrameLayout sf = (FrameLayout) findViewById(R.id.snoozFrame);
            tv.measure(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED);
            sf.measure(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED);
            sf.addView(tv, tv.getMeasuredWidth(), ViewGroup.LayoutParams.WRAP_CONTENT);
            animScroll = new TranslateAnimation(sf.getMeasuredWidth(), tv.getMeasuredWidth()*-1, 0, 0);
            long durationMulti = ((sf.getMeasuredWidth()+tv.getMeasuredWidth())/sf.getMeasuredWidth());
            int duration = (int) (5000*durationMulti);
            animScroll.setDuration(duration);
            animScroll.setInterpolator(new LinearInterpolator());
            animScroll.setRepeatCount(Animation.INFINITE);
            tv.startAnimation(animScroll);
        }

        snooze.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                handler.removeCallbacks(alertLoop);
                handler.removeCallbacksAndMessages(null);
                AlarmReceiverRepeating.resetPhone(Alarm.this);
                AlarmReceiver ar = new AlarmReceiver();
                ar.setOnetimeTimer(Alarm.this, Alarm.ALARM_DATA.getId(), (long) (System.currentTimeMillis() + (1000*60*snoozeInt)),Alarm.ALARM_DATA.getId());
                Intent mainIntent = new Intent(Alarm.this,Main.class);
                mainIntent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
                startActivity(mainIntent);
                finish();
                AlarmWakeLock.releaseCpuLock();
            }
        });

        mSensorListener.setOnShakeListener(new ShakeEventListener.OnShakeListener() {

              public void onShake() {
                handler.removeCallbacks(alertLoop);
                handler.removeCallbacksAndMessages(null);
                AlarmReceiverRepeating.resetPhone(Alarm.this);
                Intent mainIntent = new Intent(Alarm.this,Main.class);
                mainIntent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
                startActivity(mainIntent);
                Notifications.setNextAlarmNotification(Alarm.this);
                AlarmReceiverRepeating.resetPhone(Alarm.this);
                finish();
                AlarmWakeLock.releaseCpuLock();
              }
            });
        AlarmReceiverRepeating.setCurrentState(Alarm.this,Alarm.ALARM_DATA.getVolume());
        handler.post(alertLoop);
    }


    //function for playing the ringer and vibrator
    public void playAlarm(){

        try {
            if(AlarmReceiverRepeating.AUDIO_MANAGER == null){
                AlarmReceiverRepeating.setCurrentState(Alarm.this, Alarm.ALARM_DATA.getVolume());
            }
            AlarmReceiverRepeating.REPEAT_COUNT ++;
            if(AlarmReceiverRepeating.REPEAT_COUNT > 1){
                AlarmReceiverRepeating.REPEAT_COUNT = 0;
                if(AlarmReceiverRepeating.CURRENT_VOLUME < AlarmReceiverRepeating.ADJUSTED_MAX_VOLUME)
                    AlarmReceiverRepeating.CURRENT_VOLUME++;
            }
            AlarmReceiverRepeating.AUDIO_MANAGER.setStreamVolume(AudioManager.STREAM_RING, AlarmReceiverRepeating.CURRENT_VOLUME, AudioManager.FLAG_REMOVE_SOUND_AND_VIBRATE);
            Vibrator vibrator = (Vibrator) this.getSystemService(Context.VIBRATOR_SERVICE);
            vibrator.vibrate(2000);
            AlarmReceiverRepeating.AUDIO_MANAGER.setStreamVolume(AudioManager.STREAM_RING, AlarmReceiverRepeating.CURRENT_VOLUME, AudioManager.FLAG_REMOVE_SOUND_AND_VIBRATE);
            Uri alarm = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM);
            SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(Alarm.this);
            MediaPlayer mediaPlayer = new MediaPlayer();
            try {
                mediaPlayer.setDataSource(Alarm.this, alarm);
            } catch (Exception e1) {
                e1.printStackTrace();
                mediaPlayer.release();
                return;
            }
            mediaPlayer.setAudioStreamType(AudioManager.STREAM_RING);
            mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
                @Override
                public void onCompletion(MediaPlayer mediaPlayer) {
                    mediaPlayer.release();
                }
            });
            try {
                mediaPlayer.prepare();
            } catch (Exception e1) {
                e1.printStackTrace();
                mediaPlayer.release();
                return;
            }
            mediaPlayer.setOnSeekCompleteListener(new MediaPlayer.OnSeekCompleteListener() {

                @Override
                public void onSeekComplete(MediaPlayer mediaPlayer) {
                    mediaPlayer.stop();
                    mediaPlayer.start();
                }
            });
            mediaPlayer.setVolume(AlarmReceiverRepeating.CURRENT_VOLUME, AlarmReceiverRepeating.CURRENT_VOLUME);
            mediaPlayer.start();
         }
        catch (Throwable t) {
            Log.i("ALARM", "ERROR PLAYING ALARM");
            Toast.makeText(this, "there was a problem in the playAlarm function", Toast.LENGTH_SHORT).show();
        }
    }//end playAlarm



    @Override
    protected void onStop(){
        super.onStop();
        Log.i("ALARM", "on stop ran");
        handler.removeCallbacks(alertLoop);
        handler.removeCallbacksAndMessages(null);
        Notifications.setNextAlarmNotification(Alarm.this);
        AlarmReceiverRepeating.resetPhone(this);
        finish();
        AlarmWakeLock.releaseCpuLock();

    }
    @Override
    protected void onStart(){
        super.onStart();

    }
    @Override
    protected void onPause(){
        super.onPause();
        Log.i("ALARM", "on pause ran");

    }
    @Override
    protected void onDestroy(){
        super.onDestroy();
    }
    @Override
    protected void onResume() {
        super.onResume();
        turnOnScreen();
        Log.i("ALARM", "on resume ran");
        mSensorManager.registerListener(mSensorListener,
        mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
        SensorManager.SENSOR_DELAY_UI);
    }
    private void turnOnScreen(){
        final Window window = this.getWindow();
        window.addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
                + WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
                + WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
                + WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);
    }

    private class SetupAlarm extends AsyncTask<Void, Void, Void> {

          protected Void doInBackground(Void... urls) {
             init();
             return null;
          }

          protected void onPostExecute(Void args) {
              setupUI();
          }
        }

}

我已經知道發生了什么事。 這不是一個喚醒問題。 問題是,無論出於何種原因,當手機從睡眠狀態喚醒時,onStop函數仍被調用。 因為我有一個finish()函數正在運行,所以它殺死了活動。 我將代碼放置在onStop替代中,以便在用戶單擊后退或主頁按鈕時警報將停止,因此除非有人能啟發我為什么將onStop稱為如何避免它,否則我將需要解決此問題。 謝謝

您需要在清單中包括此權限:
Uses-permission android:name =“ android.permission.WAKE_LOCK”或看到它可能對您有幫助如何防止Android設備以編程方式進入睡眠狀態?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM