Android提供的系统服务之--AlarmManager(闹钟服务)
2016-01-18 23:57
627 查看
Android提供的系统服务之--AlarmManager(闹钟服务)
——转载请注明出处:coder-pig
本节引言:
本节主要介绍的是Android系统服务中的---AlarmManager(闹钟服务),
除了开发手机闹钟外,更多的时候是作为一个全局的定时器,通常与Service
结合,在特定时间启动其他的组件!本节就来对这个AlarmManager来进行解析
同时通过小闹钟与自动换壁纸来演示这个AlarmManager的用法,好了,开始本节的
内容吧!
本节正文:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201601/f364ffc27b970112a5ddfb132706108b)
分别是定时闹钟提醒的实现与定时更换手机壁纸,一个是调用Activity,一个是调用Service
[java] view
plain copy print?
![](https://oscdn.geek-share.com/Uploads/Images/Content/201611/a7c8e286f463007e2a900848b93dd72c.png)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201611/9e12f1d3e499fc949c886e7c9e0484f9)
package com.jay.example.alarmmanagerdemo;
import java.util.Calendar;
import android.app.Activity;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.app.TimePickerDialog;
import android.app.TimePickerDialog.OnTimeSetListener;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TimePicker;
import android.widget.Toast;
public class MainActivity extends Activity {
private Button btnSetClock;
private Button btnbtnCloseClock;
private AlarmManager alarmManager;
private PendingIntent pi;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btnSetClock = (Button) findViewById(R.id.btnSetClock);
btnbtnCloseClock = (Button) findViewById(R.id.btnCloseClock);
// ①获取AlarmManager对象:
alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
// 指定要启动的是Activity组件,通过PendingIntent调用getActivity来设置
Intent intent = new Intent(MainActivity.this, ClockActivity.class);
pi = PendingIntent.getActivity(MainActivity.this, 0, intent, 0);
btnSetClock.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Calendar currentTime = Calendar.getInstance();
// 弹出一个时间设置的对话框,供用户选择时间
new TimePickerDialog(MainActivity.this, 0,
new OnTimeSetListener() {
@Override
public void onTimeSet(TimePicker view,
int hourOfDay, int minute) {
//设置当前时间
Calendar c = Calendar.getInstance();
c.setTimeInMillis(System.currentTimeMillis());
// 根据用户选择的时间来设置Calendar对象
c.set(Calendar.HOUR, hourOfDay);
c.set(Calendar.MINUTE, minute);
// ②设置AlarmManager在Calendar对应的时间启动Activity
alarmManager.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();
btnbtnCloseClock.setVisibility(View.VISIBLE);
}
});
btnbtnCloseClock.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
alarmManager.cancel(pi);
btnbtnCloseClock.setVisibility(View.GONE);
Toast.makeText(MainActivity.this, "闹钟已取消", Toast.LENGTH_SHORT)
.show();
}
});
}
}
ClockActivity.java:
[java] view
plain copy print?
![](https://oscdn.geek-share.com/Uploads/Images/Content/201611/a7c8e286f463007e2a900848b93dd72c.png)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201611/9e12f1d3e499fc949c886e7c9e0484f9)
package com.jay.example.alarmmanagerdemo;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.media.MediaPlayer;
import android.os.Bundle;
public class ClockActivity extends Activity {
private MediaPlayer mediaPlayer;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_clock);
mediaPlayer = MediaPlayer.create(this, R.raw.pig);
//mediaPlayer.setLooping(true);
mediaPlayer.start();
//创建一个闹钟提醒的对话框,点击确定关闭铃声与页面
new AlertDialog.Builder(ClockActivity.this).setTitle("闹钟").setMessage("小猪小猪快起床~")
.setPositiveButton("关闭闹铃", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
mediaPlayer.stop();
ClockActivity.this.finish();
}
}).show();
}
}
!!!另外别忘了需要在AndroidManifest.xml对ClockActivity进行注册哦!
运行截图:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201601/70ffb9a58f2d12f3ccf1729652a09d51)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201601/b9ff0d15474bf4cc91a124834f6888b8)
总结核心流程吧:
①AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
获得系统提供的AlarmManager服务的对象
②Intent设置要启动的组件:
Intent intent = new Intent(MainActivity.this, ClockActivity.class);
③PendingIntent对象设置动作,启动的是Activity还是Service,又或者是广播!
PendingIntent pi = PendingIntent.getActivity(MainActivity.this, 0, intent, 0);
④调用AlarmManager的set( )方法设置单次闹钟的闹钟类型,启动时间以及PendingIntent对象!
alarmManager.set(AlarmManager.RTC_WAKEUP,c.getTimeInMillis(), pi);
这里我们涉及到另外一个API:WallpaperManager,管理壁纸的,提供了下述几个方法供我们使用:
setBitmap(Bitmap bitmap),setResource(int resid),setStream(InputStream data);
还有一个清除壁纸的clean方法!
流程和前面的闹钟原理差不多,就不讲解了,直接贴代码吧:
activity_main.xml:
[html] view
plain copy print?
![](https://oscdn.geek-share.com/Uploads/Images/Content/201611/a7c8e286f463007e2a900848b93dd72c.png)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201611/9e12f1d3e499fc949c886e7c9e0484f9)
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/LinearLayout1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.example.alarmmanagerdemo2.MainActivity" >
<Button
android:id="@+id/btnOn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="开启自动换壁纸" />
<Button
android:id="@+id/btnOff"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="关闭自动换壁纸" />
<Button
android:id="@+id/btnCancel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="清除壁纸" />
</LinearLayout>
接下来到MainActivity.java:
[java] view
plain copy print?
![](https://oscdn.geek-share.com/Uploads/Images/Content/201611/a7c8e286f463007e2a900848b93dd72c.png)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201611/9e12f1d3e499fc949c886e7c9e0484f9)
package com.example.alarmmanagerdemo2;
import java.io.IOException;
import android.app.Activity;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.app.WallpaperManager;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;
public class MainActivity extends Activity {
private Button btnOn;
private Button btnOff;
private Button btnCancel;
private AlarmManager alarmManager;
private PendingIntent pi;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//①获得AlarmManager对象:
alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);;
//②指定要启动的Service,并指明动作是Servce:
Intent intent = new Intent(MainActivity.this,WallPagerService.class);
pi = PendingIntent.getService(MainActivity.this, 0, intent, 0);
btnOn = (Button) findViewById(R.id.btnOn);
btnOff = (Button) findViewById(R.id.btnOff);
btnCancel = (Button) findViewById(R.id.btnCancel);
btnOn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, 0, 3000, pi);
btnOn.setEnabled(false);
btnOff.setEnabled(true);
Toast.makeText(MainActivity.this, "自动更换壁纸设置成功", Toast.LENGTH_SHORT).show();
}
});
btnOff.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
btnOn.setEnabled(true);
btnOff.setEnabled(false);
alarmManager.cancel(pi);
}
});
btnCancel.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
try {
WallpaperManager.getInstance(getApplicationContext()).clear();
Toast.makeText(MainActivity.this, "清除壁纸成功~", Toast.LENGTH_SHORT).show();
} catch (IOException e) {e.printStackTrace();}
}
});
}
}
还有我们自定义的换壁纸的Service:
[java] view
plain copy print?
![](https://oscdn.geek-share.com/Uploads/Images/Content/201611/a7c8e286f463007e2a900848b93dd72c.png)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201611/9e12f1d3e499fc949c886e7c9e0484f9)
package com.example.alarmmanagerdemo2;
import android.app.Service;
import android.app.WallpaperManager;
import android.content.Intent;
import android.os.IBinder;
public class WallPagerService extends Service {
//定义当前壁纸下表
int current = 0;
//获取壁纸资源id数组
private int[] paper = new int[] { R.drawable.gui_1, R.drawable.gui_2,
R.drawable.gui_3, R.drawable.gui_4, };
//定义WallpaperManager服务
private WallpaperManager wManager;
//初始化WallPagerManager
@Override
public void onCreate() {
super.onCreate();
wManager = WallpaperManager.getInstance(this);
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
if(current >= 4)current = 0;
try{
wManager.setResource(paper[current++]);
}catch(Exception e){e.printStackTrace();}
return START_STICKY;
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
}
别忘了在AndroidManifest.xml文件中添加壁纸的权限哦!以及为我们的Service注册!!!
[java] view
plain copy print?
![](https://oscdn.geek-share.com/Uploads/Images/Content/201611/a7c8e286f463007e2a900848b93dd72c.png)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201611/9e12f1d3e499fc949c886e7c9e0484f9)
<uses-permission android:name="android.permission.SET_WALLPAPER" />
运行效果图:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201601/2809f9506d44d363f98ba6469baec4a0)
最后说两句:
就是这么简单,关于这个AlarmManager(闹钟服务)就学习到这里吧,在后面我们在Service实例讲解
处还会做一个后台定时发送短信的例子,敬请期待~
2.定时切换壁纸:http://pan.baidu.com/s/1dDhasGp
参考资料:
李刚老师的:《疯狂Android讲义》
网上的一篇文章:http://www.360doc.com/content/13/0110/23/11991_259460170.shtml
——转载请注明出处:coder-pig
本节引言:
本节主要介绍的是Android系统服务中的---AlarmManager(闹钟服务),
除了开发手机闹钟外,更多的时候是作为一个全局的定时器,通常与Service
结合,在特定时间启动其他的组件!本节就来对这个AlarmManager来进行解析
同时通过小闹钟与自动换壁纸来演示这个AlarmManager的用法,好了,开始本节的
内容吧!
本节正文:
1.概念与相关属性方法图:
2.例子演示
好了,光看不练可不行,下面就来写两个简单的例子:分别是定时闹钟提醒的实现与定时更换手机壁纸,一个是调用Activity,一个是调用Service
①一个简单的闹钟:
MainActivity.java:[java] view
plain copy print?
![](https://oscdn.geek-share.com/Uploads/Images/Content/201611/a7c8e286f463007e2a900848b93dd72c.png)
package com.jay.example.alarmmanagerdemo;
import java.util.Calendar;
import android.app.Activity;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.app.TimePickerDialog;
import android.app.TimePickerDialog.OnTimeSetListener;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TimePicker;
import android.widget.Toast;
public class MainActivity extends Activity {
private Button btnSetClock;
private Button btnbtnCloseClock;
private AlarmManager alarmManager;
private PendingIntent pi;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btnSetClock = (Button) findViewById(R.id.btnSetClock);
btnbtnCloseClock = (Button) findViewById(R.id.btnCloseClock);
// ①获取AlarmManager对象:
alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
// 指定要启动的是Activity组件,通过PendingIntent调用getActivity来设置
Intent intent = new Intent(MainActivity.this, ClockActivity.class);
pi = PendingIntent.getActivity(MainActivity.this, 0, intent, 0);
btnSetClock.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Calendar currentTime = Calendar.getInstance();
// 弹出一个时间设置的对话框,供用户选择时间
new TimePickerDialog(MainActivity.this, 0,
new OnTimeSetListener() {
@Override
public void onTimeSet(TimePicker view,
int hourOfDay, int minute) {
//设置当前时间
Calendar c = Calendar.getInstance();
c.setTimeInMillis(System.currentTimeMillis());
// 根据用户选择的时间来设置Calendar对象
c.set(Calendar.HOUR, hourOfDay);
c.set(Calendar.MINUTE, minute);
// ②设置AlarmManager在Calendar对应的时间启动Activity
alarmManager.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();
btnbtnCloseClock.setVisibility(View.VISIBLE);
}
});
btnbtnCloseClock.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
alarmManager.cancel(pi);
btnbtnCloseClock.setVisibility(View.GONE);
Toast.makeText(MainActivity.this, "闹钟已取消", Toast.LENGTH_SHORT)
.show();
}
});
}
}
ClockActivity.java:
[java] view
plain copy print?
![](https://oscdn.geek-share.com/Uploads/Images/Content/201611/a7c8e286f463007e2a900848b93dd72c.png)
package com.jay.example.alarmmanagerdemo;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.media.MediaPlayer;
import android.os.Bundle;
public class ClockActivity extends Activity {
private MediaPlayer mediaPlayer;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_clock);
mediaPlayer = MediaPlayer.create(this, R.raw.pig);
//mediaPlayer.setLooping(true);
mediaPlayer.start();
//创建一个闹钟提醒的对话框,点击确定关闭铃声与页面
new AlertDialog.Builder(ClockActivity.this).setTitle("闹钟").setMessage("小猪小猪快起床~")
.setPositiveButton("关闭闹铃", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
mediaPlayer.stop();
ClockActivity.this.finish();
}
}).show();
}
}
!!!另外别忘了需要在AndroidManifest.xml对ClockActivity进行注册哦!
运行截图:
总结核心流程吧:
①AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
获得系统提供的AlarmManager服务的对象
②Intent设置要启动的组件:
Intent intent = new Intent(MainActivity.this, ClockActivity.class);
③PendingIntent对象设置动作,启动的是Activity还是Service,又或者是广播!
PendingIntent pi = PendingIntent.getActivity(MainActivity.this, 0, intent, 0);
④调用AlarmManager的set( )方法设置单次闹钟的闹钟类型,启动时间以及PendingIntent对象!
alarmManager.set(AlarmManager.RTC_WAKEUP,c.getTimeInMillis(), pi);
②后台Service定时更换壁纸:
从上面的代码我们发现AlarmManager的用法其实就那么几步,很简单,接下来我们弄一个Service这里我们涉及到另外一个API:WallpaperManager,管理壁纸的,提供了下述几个方法供我们使用:
setBitmap(Bitmap bitmap),setResource(int resid),setStream(InputStream data);
还有一个清除壁纸的clean方法!
流程和前面的闹钟原理差不多,就不讲解了,直接贴代码吧:
activity_main.xml:
[html] view
plain copy print?
![](https://oscdn.geek-share.com/Uploads/Images/Content/201611/a7c8e286f463007e2a900848b93dd72c.png)
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/LinearLayout1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.example.alarmmanagerdemo2.MainActivity" >
<Button
android:id="@+id/btnOn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="开启自动换壁纸" />
<Button
android:id="@+id/btnOff"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="关闭自动换壁纸" />
<Button
android:id="@+id/btnCancel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="清除壁纸" />
</LinearLayout>
接下来到MainActivity.java:
[java] view
plain copy print?
![](https://oscdn.geek-share.com/Uploads/Images/Content/201611/a7c8e286f463007e2a900848b93dd72c.png)
package com.example.alarmmanagerdemo2;
import java.io.IOException;
import android.app.Activity;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.app.WallpaperManager;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;
public class MainActivity extends Activity {
private Button btnOn;
private Button btnOff;
private Button btnCancel;
private AlarmManager alarmManager;
private PendingIntent pi;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//①获得AlarmManager对象:
alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);;
//②指定要启动的Service,并指明动作是Servce:
Intent intent = new Intent(MainActivity.this,WallPagerService.class);
pi = PendingIntent.getService(MainActivity.this, 0, intent, 0);
btnOn = (Button) findViewById(R.id.btnOn);
btnOff = (Button) findViewById(R.id.btnOff);
btnCancel = (Button) findViewById(R.id.btnCancel);
btnOn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, 0, 3000, pi);
btnOn.setEnabled(false);
btnOff.setEnabled(true);
Toast.makeText(MainActivity.this, "自动更换壁纸设置成功", Toast.LENGTH_SHORT).show();
}
});
btnOff.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
btnOn.setEnabled(true);
btnOff.setEnabled(false);
alarmManager.cancel(pi);
}
});
btnCancel.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
try {
WallpaperManager.getInstance(getApplicationContext()).clear();
Toast.makeText(MainActivity.this, "清除壁纸成功~", Toast.LENGTH_SHORT).show();
} catch (IOException e) {e.printStackTrace();}
}
});
}
}
还有我们自定义的换壁纸的Service:
[java] view
plain copy print?
![](https://oscdn.geek-share.com/Uploads/Images/Content/201611/a7c8e286f463007e2a900848b93dd72c.png)
package com.example.alarmmanagerdemo2;
import android.app.Service;
import android.app.WallpaperManager;
import android.content.Intent;
import android.os.IBinder;
public class WallPagerService extends Service {
//定义当前壁纸下表
int current = 0;
//获取壁纸资源id数组
private int[] paper = new int[] { R.drawable.gui_1, R.drawable.gui_2,
R.drawable.gui_3, R.drawable.gui_4, };
//定义WallpaperManager服务
private WallpaperManager wManager;
//初始化WallPagerManager
@Override
public void onCreate() {
super.onCreate();
wManager = WallpaperManager.getInstance(this);
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
if(current >= 4)current = 0;
try{
wManager.setResource(paper[current++]);
}catch(Exception e){e.printStackTrace();}
return START_STICKY;
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
}
别忘了在AndroidManifest.xml文件中添加壁纸的权限哦!以及为我们的Service注册!!!
[java] view
plain copy print?
![](https://oscdn.geek-share.com/Uploads/Images/Content/201611/a7c8e286f463007e2a900848b93dd72c.png)
<uses-permission android:name="android.permission.SET_WALLPAPER" />
运行效果图:
最后说两句:
就是这么简单,关于这个AlarmManager(闹钟服务)就学习到这里吧,在后面我们在Service实例讲解
处还会做一个后台定时发送短信的例子,敬请期待~
本节代码下载:
1.定时闹钟:http://pan.baidu.com/s/1qW9eiWc2.定时切换壁纸:http://pan.baidu.com/s/1dDhasGp
参考资料:
李刚老师的:《疯狂Android讲义》
网上的一篇文章:http://www.360doc.com/content/13/0110/23/11991_259460170.shtml
相关文章推荐
- 《Android开发艺术探索》读书笔记 (4) 第4章 View的工作原理
- android Launcher文件夾功能分析
- 下载编译 Qt 5 for Android 并新建工程
- 将Android Studio的设置恢复到初始化
- Android5.0材料设计(二)
- Android5.0材料设计(一)
- 我的Android进阶之旅------>关于使用CSDN-markdown编辑器来编写博客
- Android开发从零开始(1)--2016.01.18
- Android Activity Fragment 生命周期
- 安装谷大家的Ingress(Android)
- mac 上 配置 Android NDK 环境
- Android Apk 代码混淆与资源文件混淆实战
- Android 快速开发 打造万能的ListView GridView 适配器
- 极光推送之服务器端向android等客户端推送实例
- Android apk集成
- Android ORM框架之GreenDao的使用方法
- ArcGIS4Android 2:多个安卓module共享jar和so文件
- Android开启StrictMode模式
- android中的sp和wp
- 51.Rxjava+RxAndroid+Retrofit组合问题