new Handler().postAtTime(r, uptimeMillis);
这样开辟了一条线程,可能在某个时刻系统资源紧缺的情况下清理掉了,即使没有被清理,也可能会因为内存吃紧等情况下回收掉该线程。那么怎么实现定时操作,第一反应是安卓操作系统实现闹钟的功能,那么我们可以尝试从闹钟功能方面进行入手,看有没有相关的接口,在安卓方便,比回调接口更为被动发动的技能就是广播了,我们可以考虑是否通过广播来接收到某一个时刻的到来呢,终于,系统还是提供了AlarmManager给开发者较为便捷的方式实现定时功能;
本例程共有3个类;
MainActivity.java
public class MainActivity extends Activity {
private AlarmManager alarmManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(MainActivity.this, AlarmReceiver.class); // 创建Intent对象
PendingIntent pi = PendingIntent.getBroadcast(MainActivity.this, 0,
intent, 0); // 创建PendingIntent
alarmManager.set(AlarmManager.RTC_WAKEUP, getTime(), pi); // 设置闹钟,当前时间就唤醒
}
private long getTime() {
Calendar c=Calendar.getInstance();//获取日期对象
c.setTimeInMillis(System.currentTimeMillis()); //设置Calendar对象
int time = c.get(Calendar.SECOND) + 5;
c.set(Calendar.SECOND, time); //设置闹钟的秒数
c.set(Calendar.MILLISECOND, 0); //设置闹钟的毫秒数
return c.getTimeInMillis();
}
}
public class AlarmReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
Intent i=new Intent(context, AlarmActivity.class);
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(i);
}
}
例程中也不需要使用相关的权限,清单配置文档如下:
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".AlarmActivity" />
<!-- android:process=":remote": 新开一个进程 -->
<receiver android:name=".AlarmReceiver" android:process=":remote"/>
</application>