流程:设定时间>利用AlarmManager(闹钟管理器)通知PendingIntent跳转到指定的activity,实现闹铃跟通知。
代码如下:
activity_main.xml(设定何时通知):
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main"
android:layout_width="match_parent" android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:orientation="vertical"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.android28_alarm_notification.MainActivity">
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="闹钟一次"
android:onClick="oneAlarm"
/>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="周期闹钟"
android:onClick="periodAlarm"
/>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="关闭周期闹钟"
android:onClick="closeAlarm"
/>
LinearLayout>
activity_ring.xml(闹钟的页面):
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main"
android:layout_width="match_parent" android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:orientation="vertical"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.android28_alarm_notification.MainActivity">
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="闹钟一次"
android:onClick="oneAlarm"
/>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="周期闹钟"
android:onClick="periodAlarm"
/>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="关闭周期闹钟"
android:onClick="closeAlarm"
/>
LinearLayout>
MainActivity.java
package com.example.android28_alarm_notification;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.app.TimePickerDialog;
import android.content.Context;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.TimePicker;
import java.util.Calendar;
import static android.icu.lang.UCharacter.GraphemeClusterBreak.T;
public class MainActivity extends AppCompatActivity {
private AlarmManager alarmManager;
private PendingIntent pi;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//得到闹钟管理器
alarmManager = (AlarmManager) this.getSystemService(Context.ALARM_SERVICE);
}
//开启单此闹钟
public void oneAlarm(View view){
//获得当前系统的小时跟分
Calendar calendar=Calendar.getInstance();
int hour=calendar.get(Calendar.HOUR_OF_DAY);//得到小时
final int minue=calendar.get(Calendar.MINUTE);//得到分钟
Log.i("test",hour+"....."+minue);
//弹出世间对话框
TimePickerDialog tpd=new TimePickerDialog(this, new TimePickerDialog.OnTimeSetListener() {
@Override
public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
Calendar calendar=Calendar.getInstance();
calendar.set(Calendar.HOUR_OF_DAY,hourOfDay);
calendar.set(Calendar.MINUTE,minue);
Intent intent=new Intent();
intent.setAction("com.example.android28_alarm_notification.RING");
PendingIntent pi=PendingIntent.getBroadcast(MainActivity.this,0x105,intent,0);
//时间一到
alarmManager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(),pi);
}
},hour,minue,true);
tpd.show();//显示窗口
}
//开启周期闹钟
public void periodAlarm(View view){
//获得当前系统的小时跟分
Calendar calendar=Calendar.getInstance();
int hour=calendar.get(Calendar.HOUR_OF_DAY);//得到小时
final int minue=calendar.get(Calendar.MINUTE);//得到分钟
//弹出世间对话框
TimePickerDialog tpd=new TimePickerDialog(this, new TimePickerDialog.OnTimeSetListener() {
@Override
public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
Calendar calendar=Calendar.getInstance();
calendar.set(Calendar.HOUR_OF_DAY,hourOfDay);
calendar.set(Calendar.MINUTE,minue);
Intent intent=new Intent();
intent.setAction("com.example.android28_alarm_notification.RING");
pi = PendingIntent.getBroadcast(MainActivity.this,0x102,intent,0);
//时间一到
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(),60*60*24*1000, pi);
}
},hour,minue,true);
tpd.show();//显示窗口
}
//关闭周期闹钟
public void closeAlarm(View view){
alarmManager.cancel(pi);//取消周期的闹钟
}
}
RingActivity.java:
package com.example.android28_alarm_notification;
import android.app.Notification;
import android.app.NotificationManager;
import android.content.Context;
import android.media.MediaPlayer;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.app.NotificationCompat;
import android.view.View;
import static android.R.attr.x;
public class RingActivity extends AppCompatActivity {
private MediaPlayer mp;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_ring);
mp = MediaPlayer.create(this, R.raw.bow);
mp.start();
//实例化管理
final NotificationManager nm= (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
//实例化通知
final NotificationCompat.Builder nc=new NotificationCompat.Builder(this);
//默认哪些特色提示
nc.setDefaults(NotificationCompat.DEFAULT_ALL);
//通知标题
nc.setContentTitle("下载");
//设置通知图片
nc.setSmallIcon(android.R.drawable.ic_lock_idle_alarm);
//通知内容
nc.setContentText("下载中...");
//得到build
Notification notification=nc.build();
//发送通知
nm.notify(0x110,notification);
//增加一个进度条
nc.setProgress(100,0,false);//初始为0
//给一个子线程
new Thread(){
@Override
public void run() {
super.run();
//设置不可删除通知
// nc.build().flags=Notification.FLAG_ONGOING_EVENT;
for (int i=1;i<=100;i++){
nc.setProgress(100,i,false);
nm.notify(0x110,nc.build());
nc.setContentText("下载:"+i+"%");
try {
//模拟下载
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//下载完成后更改标题以及提示信息
nc.setContentTitle("开始安装");
nc.setContentText("安装中...");
//设置进度为不确定,用于模拟安装
nc.setProgress(0,0,true);
nc.build().flags=Notification.FLAG_NO_CLEAR;
nm.notify(0x110,nc.build());
}
}.start();
}
//关闭闹钟
public void stop(View view){
mp.stop();
finish();//干掉自己
}
}
#####因为这边我用的是广播通知跳转的activity,所以我这里还有一个静态的广播接收者
package com.example.android28_alarm_notification;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
import static android.transition.Fade.IN;
/**
* Created by Administrator on 2017/2/22.
*/
public class RingReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent1) {
if("com.example.android28_alarm_notification.RING".equals(intent1.getAction())){
Log.i("test","收到广播了");
Intent intent=new Intent(context,RingActivity.class);
//广播跳activity必须设置标志位
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);//新的栈
context.startActivity(intent);
}
}
}
清单文件 AndroidManifest.xml:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.android28_alarm_notification">
<uses-permission android:name="android.permission.VIBRATE">uses-permission>
<uses-permission android:name="android.permission.FLASHLIGHT">uses-permission>
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
intent-filter>
activity>
<receiver android:name=".RingReceiver">
<intent-filter>
<action android:name="com.example.android28_alarm_notification.RING" />
intent-filter>
receiver>
<activity android:name=".RingActivity">activity>
application>
manifest>