手机软件开发 在线咨询电话:0451-51035763 在线QQ咨询

安卓手机开发之 去循环节省电量消耗


日期:2013/9/7 访问人数:3720人

  在手机软件开发中,经常会用到不断从服务器接口中获取信息,这个过程是循环重复的,为了尽量缩小服务器接口新信息和手机客户端信息的时间差,我们也会把循环间隔时间设置的很短,这样可以满足有新消息能及时得到提示,但这么做的敝端是耗电量非常大,在手机这个弱小而有限的电量情况下,用户体验是不佳的,那么如何来实现即能从接口得到最新消息又能减少手机软件的用电量呢?

  那么今天我们和大家分享一种代替循环的方法,使用AlarmManager类,这个是android带的一个定时类,在android经常用他来设置闹铃,试想一下,如果闹铃用上面循环的方法来做会怎样?是不是没等闹铃响起,手机已经没电了,如果有电手机已经运行很吃力了,占有手机资源很大。

  那么这个类如何使用呢?首先我们详细了解一下这个类!

  这个类有四个常量,常量都知道吧?不用我再介绍什么是常量了吧?

    第一个常量 ELAPSED_REALTIME
    在指定的延时过后,发送广播,但不唤醒设备。

    第二个常量 ELAPSED_REALTIME_WAKEUP
    在指定的演示后,发送广播,并唤醒设备
    延时是要把系统启动的时间SystemClock.elapsedRealtime()算进去的,具体用法看代码。

    第三个常量 RTC
    在指定的时刻,发送广播,但不唤醒设备

    第四个常量 RTC_WAKEUP
    在指定的时刻,发送广播,并唤醒设备

  这个类还有以下几个方法,我们详细分析一下:

   ❑ void set(int type, long triggerAtTime, PendingIntent operation)
   设置一个闹钟

   ❑ void setRepeating(int type, long triggerAtTime, long interval, PendingIntent operation)
   设置一个会重复的闹钟

   ❑ void setInexactRepeating(int type, long triggerAtTime, long interval, PendingIntent operation)
   设置一个重复闹钟的不精确版本,它相对而言更节能(power-efficient)一些,因为系统可能会将几个差不多的闹钟合并为一个来执行,减少设备的唤醒次数。
   内置的几个interval为:
   INTERVAL_FIFTEEN_MINUTES
   INTERVAL_HALF_HOUR
   INTERVAL_HOUR
   INTERVAL_HALF_DAY
   INTERVAL_DAY
   如果你将其设为DAY,那么可能这一天中的所有闹钟都会被合并掉。

   ❑ void cancel(PendingIntent operation)
   取消一个设置的闹钟

   ❑ void setTimeZone(String timeZone)
   设置系统的默认时区。需要android.permission.SET_TIME_ZONE权限

  了解完之后我们通过实例来看具体的使用方法

实例一:让手机软件每隔5秒发送一个广播

1.既然是定时发送广播,当然要有一个广播接收的类

// 首先创建Receiver
public class AlarmReceiver extends BroadcastReceiver {
 @Override
 public void onReceive(Context context, Intent intent) {
  Toast.makeText(context, "alarm", Toast.LENGTH_SHORT).show();
 }
}

2.在AndroidManifest.xml中声明这个广播

manifest中声明,并不需要intent-filter,我们是明确指定发到哪个receiver的
<receiver android:name="yuan.receivers.AlarmReceiver" />

大家要注意的是,这个声明和平常声明广播不太一样,不需要intent-filter,因为我们一会在使用AlarmReceiver时会直接指到刚才新建的AlarmReceiver广播类里

3.在Activity中运行AlarmReceiver

public class post_order extends Activity{
@Override
 protected void onCreate(Bundle savedInstanceState) {
  // TODO Auto-generated method stub
  super.onCreate(savedInstanceState);
  setContentView(R.layout.post_order);

   AlarmManager alarmMgr = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(getApplicationContext(), AlarmReceiver.class);
int requestCode = 0;
PendingIntent pendIntent = PendingIntent.getBroadcast(getApplicationContext(),
  requestCode, intent, PendingIntent.FLAG_UPDATE_CURRENT);
// 每个10秒重复发广播。广播都是直接发到AlarmReceiver的
int triggerAtTime =SystemClock.elapsedRealtime();
int interval = 10 * 1000;///设置重复时间为10s
alarmMgr.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, triggerAtTime, interval, pendIntent);
}

  代码已经完成,运行后就可以每隔10S发送一条广播,收到广播后,可以在AlarmReceiver里编写执行操作

  运行后有的同学会发现,这个是不断的在发送啊,把手机软件关闭也在发送,是的,AlarmManager 是设置全局的,那么要想取消该如何操作?

4.取消AlarmManager 的运行

  AlarmManager alarmMgr = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
    Intent intent = new Intent(getApplicationContext(), AlarmReceiver.class);
    PendingIntent pendIntent = PendingIntent.getBroadcast(getApplicationContext(), 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
    // 与上面的intent匹配(filterEquals(intent))的闹钟会被取消
   alarmMgr.cancel(pendIntent);

  这样就可以把你AlarmManager 取消

到这里大家已经全都会使用AlarmManager 了,有的同学会问,只能定时执行广播吗?不能执行我的service和activty吗?回答是肯定的,那么如何定时执行service和activty呢,很简单,把PendingIntent.getBroadcast改成PendingIntent.getService或PendingIntent.getActivty就可以了,大家可以自己编一下代码,让程序运行service和activty!

原创文章 转载请注明出处:http://www.hlj114.com/pagelist.asp?id=117

分享到:
CopyRight 2010--2015 百讯科技 版权所有
地址:哈尔滨道外区先锋路459号 联系电话:0451-51035763 18645100737 在线QQ:996610000
邮箱:3g@hlj114.com 黑ICP备09022694号