当手机进入睡眠状态时,无法让Android活动继续存在

时间:2014-01-31 05:38:58

标签: android

我对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被称为如何避免它。谢谢

1 个答案:

答案 0 :(得分:0)

您需要在清单中包含此权限:
uses-permission android:name =“android.permission.WAKE_LOCK”或看到它可能对你有用How do I prevent an Android device from going to sleep programmatically?