Android后台运行的定时器实现

Android后台运行定时器,方便我们执行定位跟踪等任务需求。 下面简要说明实现Android后台定时器的要点, 文章末尾可以下载到工程代码,可直接编译执行。

AndroidManifest.xml 文件内容如下:

<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android=""package="com.routing.videocamera"android:versionCode="1"android:versionName="1.0" ><uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /><uses-permission android:name="android.permission.INTERNET" /><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /><uses-sdkandroid:minSdkVersion="14"android:targetSdkVersion="16" /><applicationandroid:allowBackup="true"android:icon="@drawable/ic_launcher"android:label="@string/app_name"android:theme="@style/AppTheme" ><activityandroid:name="com.routing.videocamera.Video"android:label="@string/app_name" ><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity><service android:enabled="true" android:name=".TimerService" /> <receiver android:name=".AutoReceiver" android:label="@string/app_name"><intent-filter><action android:name="android.intent.action.BOOT_COMPLETED" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></receiver></application></manifest>

其中关键的代码是赋予项目 RECEIVE_BOOT_COMPLETED 权限 :

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

Video.java 文件的内容如下 :

package com.routing.videocamera;public class Video extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_video);Intent intent=new Intent(this,AutoReceiver.class);intent.setAction("VIDEO_TIMER"); PendingIntent sender = PendingIntent.getBroadcast(this, 0, intent, 0);AlarmManager am = (AlarmManager)getSystemService(ALARM_SERVICE);am.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime(), 10*1000, sender);Button btnStart = (Button)findViewById(R.id.buttonSave);btnStart.setOnClickListener(clickListener);Context ctx = Video.this;SharedPreferences sp = ctx.getSharedPreferences("VIDEO", MODE_PRIVATE);//存入数据Editor editor = sp.edit();String serverAddr = sp.getString("ServerAddr", "NULL");String cameraName = sp.getString("CameraName", "NULL");int cameraID = sp.getInt("CameraID", 0);int cameraPort = sp.getInt("CameraPort", 0);EditText editServerAddr = (EditText)findViewById(R.id.editServerAddr);editServerAddr.setText(serverAddr);EditText editCameraName = (EditText)findViewById(R.id.editCameraName);editCameraName.setText(cameraName);EditText editCameraID = (EditText)findViewById(R.id.editCameraID);editCameraID.setText(Integer.toString(cameraID));EditText editCameraPort = (EditText)findViewById(R.id.editCameraPort);editCameraPort.setText(Integer.toString(cameraPort));}private void saveSetting (){EditText editServerAddr = (EditText)findViewById(R.id.editServerAddr);String serverAddr = editServerAddr.getText().toString();EditText editCameraName = (EditText)findViewById(R.id.editCameraName);String cameraName = editCameraName.getText().toString();EditText editCameraID = (EditText)findViewById(R.id.editCameraID);int cameraID = Integer.parseInt(editCameraID.getText().toString());EditText editCameraPort = (EditText)findViewById(R.id.editCameraPort);int cameraPort = Integer.parseInt(editCameraPort.getText().toString());//获取SharedPreferences对象Context ctx = Video.this;SharedPreferences sp = ctx.getSharedPreferences("VIDEO", MODE_PRIVATE);//存入数据Editor editor = sp.edit();if (serverAddr != "")editor.putString("ServerAddr", serverAddr);if (cameraName != "")editor.putString("CameraName", cameraName);editor.putInt("CameraID", cameraID);editor.putInt("CameraPort", cameraPort);editor.commit();}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {// Inflate the menu; this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.activity_video, menu);return true;}private OnClickListener clickListener = new OnClickListener() {@Overridepublic void onClick(View v) {int ret = 0;switch(v.getId()){case R.id.buttonSave:saveSetting ();break;}}};}该文件关键的代码是OnCreate函数中的下面4行代码 :

intent.setAction("VIDEO_TIMER"); PendingIntent sender = PendingIntent.getBroadcast(this, 0, intent, 0);AlarmManager am = (AlarmManager)getSystemService(ALARM_SERVICE);am.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime(), 10*1000, sender); intent.setAction("VIDEO_TIMER") 设置系统向应用程序发送的消息类型为 VIDEO_TIMER。

am.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime(), 10*1000, sender); 该行代码让系统多久发送一次消息,我这里设置的是10秒发送一次VIDEO_TIMER消息。

发送出去的消息, 会在 class AutoReceiver extends BroadcastReceiver 类里进行接收,并处理。

下面是 TimerService.java 文件 :与一个赏心悦目的人错肩,真真实实的活着,也就够了。

Android后台运行的定时器实现

相关文章:

你感兴趣的文章:

标签云: