当手机进入睡眠状态时,无法保持android活动

当手机进入睡眠状态时,无法保持android活动,android,Android,我对安卓相当陌生,我正在尝试一个闹钟应用程序。我正在通过AlarmManager启动一项活动,只要手机处于唤醒状态,它就可以正常工作。当手机处于休眠状态时,它会正确运行代码,然后运行onStop功能关闭活动。我尝试过WakeLock和Window标志的各种组合,但都没有效果 不过,如果这有帮助的话,这在较旧的手机(2.3)上也适用。任何见解都值得赞赏 以下是报警活动的代码: package com.myAlarm.android; import java.text.SimpleDateForm

我对安卓相当陌生,我正在尝试一个闹钟应用程序。我正在通过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();
          }
        }

}
package com.myAlarm.android;
导入java.text.simpleDataFormat;
导入java.util.Date;
导入android.annotation.SuppressLint;
导入android.app.Activity;
导入android.content.Context;
导入android.content.Intent;
导入android.content.SharedReferences;
导入android.hardware.Sensor;
导入android.hardware.SensorManager;
导入android.media.AudioManager;
导入android.media.MediaPlayer;
导入android.media.ringtonemager;
导入android.net.Uri;
导入android.os.AsyncTask;
导入android.os.Bundle;
导入android.os.Handler;
导入android.os.可控震源;
导入android.preference.PreferenceManager;
导入android.util.Log;
导入android.view.Gravity;
导入android.view.view;
导入android.view.view.MeasureSpec;
导入android.view.view.OnClickListener;
导入android.view.ViewGroup;
导入android.view.ViewGroup.LayoutParams;
导入android.view.Window;
导入android.view.WindowManager;
导入android.view.animation.animation;
导入android.view.animation.LinearInterpolator;
导入android.view.animation.TranslateAnimation;
导入android.widget.DigitalClock;
导入android.widget.FrameLayout;
导入android.widget.LinearLayout;
导入android.widget.TextClock;
导入android.widget.TextView;
导入android.widget.Toast;
导入android.widget.ImageView;
导入com.snoozuloze.android.UtilityFunctions;
@SuppressLint(“新API”)
公共类警报扩展活动{
专用int timerDelay=4000;
私有int-id;
私人双打盹=1;
私有文本视图时钟文本;
私有文本查看日期文本;
私人线路布局;
专用数据库处理程序数据库;
公共静态报警行报警数据;
私人动画;
私人传感器管理器;
私有ShakeEventListener-mSensorListener;
私有可运行报警循环;
私人经办人;
私家影景打盹;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
打开屏幕();
Log.i(“报警”,“创建运行时”);
AlarmWakeLock.acquireCpuWakeLock(Alarm.this);
setContentView(R.layout.activity_报警);
msSensorManager=(SensorManager)getSystemService(Context.SENSOR\u服务);
msSensorListener=新的ShakeEventListener();
handler=新的handler();
alertLoop=new Runnable(){
@凌驾
公开募捐{
播放警报();
postDelayed(这是timerDelay);
}
};
//为数字时钟的文本时钟创建时钟
LayoutParams clockParams=新的LayoutParams(LayoutParams.MATCH_父级,LayoutParams.WRAP_内容);
clockLayout=(LinearLayout)findViewById(R.id.alarmClockLayout);
dateText=(TextView)findViewById(R.id.alarmClockDateTxt);
试一试{
TextClock tc=新的TextClock(Alarm.this);
tc.setLayoutParams(时钟参数);
tc.setTextColor(getResources().getColor(R.color.white));
重心(重心);
时钟文本=(文本时钟)tc;
}
捕获(可丢弃的t){
Log.e(“报警”,t.getMessage());
DigitalClock dc=新的数字时钟(Alarm.this);
dc.setLayoutParams(时钟参数);
setTextColor(getResources().getColor(R.color.white));
直流设置重力(重心);
时钟文本=(文本视图)dc;
}
clockLayout.addView(clockText,0);
assignText(Alarm.this、clockText,“fonts/Roboto Thin.ttf”);
SimpleDataFormat sdf=新SimpleDataFormat(“EEE.LLLL dd”);
字符串currentDateandTime=sdf.format(new Date());
dateText.setText(currentDateandTime.toLowerCase());
clockLayout.post(新的Runnable(){
公开募捐{
float clockHeight=(float)(clockLayout.getHeight()*.35);
float dateHeight=(float)(clockLayout.getHeight()*.15);
如果(时钟高度>45){
钟高=45;
日期高度=24;
}
setTextSize(((float)clockHeight));
setTextSize(((float)dateHeight));
}
});
//SetupAlarm aSetUp=新建SetupAlarm();
//aSetUp.execute();
init();
}
私有void init(){
db=新的DatabaseHandler(此);
Intent fromIntent=getIntent();
Bundle Bundle=fromIntent.getExtras();
id=bundle.getInt(“id”);
Alarm.Alarm_DATA=db.getAlarmData(id);
snooze=(ImageView)findViewById(R.id.snoozeAlarmBtn);
setupUI();
}
私有void setupUI(){
字符串消息=Alarm.Alarm_DATA.getMessage();
如果(消息!=“”&&message!=null){
TextView tv=新的TextView(Alarm.this);
tv.setText(消息);
电视节目(16),;
FrameLayout sf=(FrameLayout)findviewbyd(R.id.snoozFrame);
tv.measure(测量规格未指定,测量规格未指定);
sf.测量值(测量值未指定,测量值未指定);
sf.addView(tv、tv.getMeasuredWidth()、ViewGroup.LayoutParams.WRAP_内容);
animScroll=新的TranslateAnimation(sf.getMeasuredWidth(),tv.getMeasuredWidth()*-1,0,0);
long durationMulti=((sf.getMeasuredWidth()+tv.getMeas