2014-01-31 146 views
0

我对Android非常陌生,我正在尝试闹钟应用程序。只要手机处于清醒状态,我就可以通过AlarmManager开始工作,该工作正常。当手机处于睡眠状态时,它似乎正常运行代码,然后运行关闭活动的onStop功能。我尝试过WakeLock和Window标志的各种组合,但都无济于事。当手机进入睡眠状态时,无法获取android活动

但是,如果有帮助,这可以在旧手机(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功能(仍然)被调用。由于我有一个完成()函数运行它正在杀死该活动。我将代码放置在onStop覆盖中,以便在用户点击后面或主页按钮时停止警报,所以我需要解决这个问题,除非有人能够启发我为什么onStop被称为如何避免它。由于

回答

0

您将需要包括这个权限在你的清单:
使用许可权的android:NAME =“android.permission.WAKE_LOCK”或看到这也许对你有所帮助How do I prevent an Android device from going to sleep programmatically?

+0

我在清单中有这样的目前: <使用权限的android:name =“android.permission.WAKE_LOCK”/> – user3256040

+0

在onstop方法中的代码,并将其放在ondestroy方法,看看发生了什么。 – Lingeshwaran

相关问题