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