先说一下自己的思路,首先是上一个Demo中 不能像正常的闹钟那样,当你把手机屏幕按黑了以后,并不会自动唤醒屏幕(其他功能都正常),弹出dialog,所以我开始考虑直接用powerManager,在activity中直接唤醒屏幕,但是,这并没有什么luan用,所以我开始考虑,是不是我的powerManager有问题,然而并不是,所以这时候我才突然考虑到,这是我自己定义的app,而不是系统原生的,当我的屏幕黑了,我的activity并不能启动了,所以,唤醒就只能考虑到用广播来做,然后我就自定义了一个广播,因为广播只要是action对上了,就可以启动,但是我考虑到我的powerManager.wakelock并不是什么耗时的操作,这时候我就把代码写在了onReceive()中,来实现了我的唤醒功能.(就是类似于当你的手机屏幕黑了,你还可以继续收到QQ,微信的弹窗,这个就和硬件有关了,当你使用流量,或者wifi状态时,wifi芯片可以唤醒CPU!)
代码如下咯:
//主函数
package zzs.com.vibrator;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.app.Service;
import android.app.TimePickerDialog;
import android.content.Intent;
import android.os.Bundle;
import android.os.Vibrator;
import android.support.v7.app.AppCompatActivity;
import android.view.MotionEvent;
import android.view.View;
import android.widget.Button;
import android.widget.TimePicker;
import android.widget.Toast;
import java.util.Calendar;
//这个机制的 前提是 AlarmManager设置系统定时 然后sendBroadcast发送广播
// 再用powerManager唤醒 然后就是实现 微信啊 QQ啊 闹钟啊 这种 关了屏幕也能弹出的
//When I wrote this, only God and I understood what I was doing
//Now, God only knows
/*
*
* ┌─┐ ┌─┐
* ┌──┘ ┴───────┘ ┴──┐
* │ ─── │
* │ ─┬┘ └┬─ │
* │ ─┴─ │
* └───┐ ┌───┘
* │ └──────────────┐
* │ ├─┐
* │ ┌─┘
* └─┐ ┐ ┌───────┬──┐ ┌──┘
* │ ─┤ ─┤ │ ─┤ ─┤
* └──┴──┘ └──┴──┘
* 神兽保佑
* 代码无BUG!
*/
public class MainActivity extends AppCompatActivity {
private Vibrator mVibrator;
boolean isOpen = false;
private Button mSetTime;
Calendar currentTime = Calendar.getInstance();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
initData();
//获取系统的震动服务
mVibrator = (Vibrator) this.getSystemService(Service.VIBRATOR_SERVICE);
}
private void initData() {
mSetTime.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
new TimePickerDialog(MainActivity.this, 0, new TimePickerDialog.OnTimeSetListener() {
@Override
public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
//指定闹钟跳转
Intent intent = new Intent(MainActivity.this,AlarmActivity.class);
//指定PendingIntent对象
PendingIntent pi = PendingIntent.getActivity(MainActivity.this, 0, intent, 0);
Calendar c = Calendar.getInstance();
c.setTimeInMillis(System.currentTimeMillis());
//根据用户选择来创建calendar对象
c.set(Calendar.HOUR,hourOfDay);
c.set(Calendar.MINUTE,minute);
//获取alarmmanager对象
AlarmManager aManager = (AlarmManager) getSystemService(ALARM_SERVICE);
//设置AlarmManager的set
aManager.set(AlarmManager.RTC_WAKEUP,c.getTimeInMillis(),pi);
Toast.makeText(MainActivity.this,"闹钟设成功",Toast.LENGTH_SHORT).show();
}
},currentTime.get(Calendar.HOUR_OF_DAY),currentTime.get(Calendar.MINUTE),false).show();
}
});
}
private void initView() {
mSetTime = (Button) findViewById(R.id.setTime);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
if (isOpen == false) {
mVibrator.vibrate(10000);
isOpen = true;
} else {
mVibrator.cancel();
isOpen = false;
}
return super.onTouchEvent(event);
}
public void startV(View v) {
mVibrator.vibrate(5000);
}
public void stopV(View v) {
mVibrator.cancel();
}
}
//AlarmActivity
package zzs.com.vibrator;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.Bundle;
/**
* Created by Administrator on 2016/3/9.
*/
public class AlarmActivity extends Activity{
private MediaPlayer mMediaPlayer;
// private PowerManager.WakeLock mWakeLock;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//发送一条广播
Intent intent = new Intent();
intent.setAction("AA");
sendBroadcast(intent);
// PowerManager pm = (PowerManager) getSystemService(POWER_SERVICE);
// mWakeLock = pm.newWakeLock(PowerManager.ACQUIRE_CAUSES_WAKEUP,"WeKA");
//播放起床音乐
mMediaPlayer = MediaPlayer.create(this, R.raw.test);
mMediaPlayer.setLooping(true);
mMediaPlayer.start();
// mWakeLock.acquire();
//创建一个对话框
new AlertDialog.Builder(AlarmActivity.this).setTitle("我的自定义闹钟哦")
.setMessage("该起床了").setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//停止音乐
mMediaPlayer.stop();
//结束Activity
AlarmActivity.this.finish();
// mWakeLock.release();
}
}).show();
}
}
//最后就是我的广播咯~~
package zzs.com.vibrator;
import android.app.KeyguardManager;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.PowerManager;
import android.widget.Toast;
/**
* Created by Administrator on 2016/3/9.
*/
public class MyBroadCast extends BroadcastReceiver {
private PowerManager.WakeLock mWakeLock;
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context,"test", Toast.LENGTH_SHORT).show();
//得到powerManager
PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
//新建一个WakeLock,并且给type
pm.newWakeLock(PowerManager.ACQUIRE_CAUSES_WAKEUP | PowerManager.SCREEN_BRIGHT_WAKE_LOCK, "bright").acquire();
//得到键盘锁管理器对象
KeyguardManager km= (KeyguardManager)context.getSystemService(Context.KEYGUARD_SERVICE);
KeyguardManager.KeyguardLock kl = km.newKeyguardLock("unLock");
//解锁
kl.disableKeyguard();
}
}
//当然 你要加权限和注册广播 ,权限给了 ,注册就不说了
<uses-permission android:name="android.permission.DISABLE_KEYGUARD"/>
<uses-permission android:name="android.permission.VIBRATE"></uses-permission>
<uses-permission android:name="android.permission.WAKE_LOCK"></uses-permission>