• android 闹钟提醒并且在锁屏下弹出Dialog对话框并播放铃声和震动


    android 闹钟提醒并且在锁屏下弹出Dialog对话框并播放铃声和震动

              

    1、先简单设置一个闹钟提醒事件:

    //设置闹钟
        mSetting.setOnClickListener(new OnClickListener() {
    
            @Override
            public void onClick(View arg0) {
                // TODO Auto-generated method stub
                calendar.setTimeInMillis(System.currentTimeMillis());
                int mHour=calendar.get(Calendar.HOUR_OF_DAY);
                int mMinute=calendar.get(Calendar.MINUTE);
    
                new TimePickerDialog(MainActivity.this,
                  new TimePickerDialog.OnTimeSetListener(){                
                    public void onTimeSet(TimePicker view,int hourOfDay,
                                          int minute){
                      // 设置时间
                      calendar.setTimeInMillis(System.currentTimeMillis());
                      calendar.set(Calendar.HOUR_OF_DAY,hourOfDay);
                      calendar.set(Calendar.MINUTE,minute);
                      calendar.set(Calendar.SECOND,0);
                      calendar.set(Calendar.MILLISECOND,0);
    
                      //广播跳转
                      Intent intent = new Intent(MainActivity.this, CallAlarmReceiver.class);
                      //启动一个广播
                      PendingIntent sender=PendingIntent.getBroadcast(
                              MainActivity.this,0, intent, 0);
                      //创建闹钟
                      AlarmManager am;
                      am = (AlarmManager)getSystemService(ALARM_SERVICE);
                      am.set(AlarmManager.RTC_WAKEUP,calendar.getTimeInMillis(),sender);
    
                      String tmpS=format(hourOfDay)+":"+format(minute);
                      mDate.setText(tmpS);
    
                      //SharedPreferences保存数据,并提交
                      SharedPreferences time1Share = getPreferences(0);
                      SharedPreferences.Editor editor = time1Share.edit();
                      editor.putString("TIME1", tmpS);
                      editor.commit();
    
                      Toast.makeText(MainActivity.this,"设置闹钟时间为"+tmpS,Toast.LENGTH_SHORT).show();
                    }          
                  },mHour,mMinute,true).show();
            }
        });
    

    注意:CallAlarmReceiver 广播接收器,所以要在AndroidManifest.xml配置:如

    <receiver android:name=".CallAlarmReceiver" android:process=":remote" />
    

    2、广播接收器:

    很简单一个继承BroadcastReceiver,然后跳转到弹框的Activity

    public class CallAlarmReceiver extends BroadcastReceiver {
    
    @Override
    public void onReceive(Context context, Intent intent) {
        // TODO Auto-generated method stub
        Intent alaramIntent = new Intent(context, AlarmSettingAgain.class);
        alaramIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        context.startActivity(alaramIntent);
    }
    }
    

    3、接收后处理,包括弹出dialog,播放铃声,震动和锁屏状态下亮屏

    (1)、首先要在onCreate()上加一句,确保在锁屏状态下弹出Dialog不会出错。

       @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE); // hide title
        Window win = getWindow();
        WindowManager.LayoutParams winParams = win.getAttributes();
        winParams.flags |= (WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD
                | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
                | WindowManager.LayoutParams.FLAG_ALLOW_LOCK_WHILE_SCREEN_ON | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
    
        startMedia();
        startVibrator();
        createDialog();
    }
    

    (2)、锁屏状态下唤醒屏幕,要在onResume() 方法中启动,并且要在onPause()中释放,否则会出错。

    @Override
    protected void onResume() {
        super.onResume();
        // 唤醒屏幕
        acquireWakeLock();
    }
    
    @Override
    protected void onPause() {
        super.onPause();
        releaseWakeLock();
    }
    
    /**
     * 唤醒屏幕
     */
    private void acquireWakeLock() {
        if (mWakelock == null) {
            PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
            mWakelock = pm.newWakeLock(PowerManager.ACQUIRE_CAUSES_WAKEUP
                    | PowerManager.SCREEN_DIM_WAKE_LOCK, this.getClass()
                    .getCanonicalName());
            mWakelock.acquire();
        }
    }
    
    /**
     * 释放锁屏
     */
    private void releaseWakeLock() {
        if (mWakelock != null && mWakelock.isHeld()) {
            mWakelock.release();
            mWakelock = null;
        }
    }
    

    (3)、播放铃声:

    /**
     * 开始播放铃声
     */
    private void startMedia() {
        try {
            mp.setDataSource(this,
                    RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM)); //铃声类型为默认闹钟铃声
            mp.prepare();
            mp.start();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    

    (4)、震动:

    /**
     * 震动
     */
    private void startVibrator() {
        /**
         * 想设置震动大小可以通过改变pattern来设定,如果开启时间太短,震动效果可能感觉不到
         * 
         */
        vibrator = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
        long[] pattern = { 500, 1000, 500, 1000 }; // 停止 开启 停止 开启
        vibrator.vibrate(pattern, 0);
    }
    

    (5)、弹出Dialog对话框

    private void createDialog() {
            new AlertDialog.Builder(this)
                    .setIcon(R.drawable.clock)
                    .setTitle("闹钟提醒时间到了!!")
                    .setMessage("你使用闹钟时间到了!!!")
                    .setPositiveButton("推迟10分钟", new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int whichButton) {
                            tenMRemind();
                            mp.stop();
                            vibrator.cancel();
                            finish();
                        }
                    })
                    .setNegativeButton("关闭", new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int whichButton) {
                            mp.stop();
                            vibrator.cancel();
                            finish();
                        }
                    }).show();
        }
    
    /**
     * 推迟10分钟提醒
     */
    private void tenMRemind(){
        //设置时间
        Calendar calendar_now =Calendar.getInstance();
    
    
        calendar_now.setTimeInMillis(System.currentTimeMillis());
        calendar_now.set(Calendar.HOUR_OF_DAY, calendar_now.get(Calendar.HOUR_OF_DAY));
        calendar_now.set(Calendar.MINUTE, calendar_now.get(Calendar.MINUTE)+10);
        calendar_now.set(Calendar.SECOND, 0);
        calendar_now.set(Calendar.MILLISECOND, 0);
    
        //时间选择好了
        Intent intent = new Intent(this, CallAlarmReceiver.class);
        //注册闹钟广播
        PendingIntent sender = PendingIntent.getBroadcast(
                this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
    
        AlarmManager am;
        am = (AlarmManager) this.getSystemService(this.ALARM_SERVICE);
        am.set(AlarmManager.RTC_WAKEUP, calendar_now.getTimeInMillis(), sender);
    }
    

    (6)、因为震动和锁屏都是系统级的,所以要在AndroidManifest.xml加上权限

    <uses-permission android:name="android.permission.VIBRATE" />
    <uses-permission android:name="android.permission.WAKE_LOCK"/>
  • 相关阅读:
    虚方法和抽象方法
    c#_实现FTP方法(一) FtpWebRequest
    sql server 分页
    5ucms进阶
    图片处理函数
    [转]C++11新特性:Lambda函数
    [STL]for_each详细用法[转]
    [算法]hash table 与 hash map 实现
    [算法]字典树
    [STL]vector的使用[转]
  • 原文地址:https://www.cnblogs.com/Free-Thinker/p/6704760.html
Copyright © 2020-2023  润新知