此demo實現了一個鬧鈴,用AlarmManager對象設定鬧鈴,時間到了後,系統會調用設定好的BroadcastReceiver、Service或者Activity。
AlarmManager可以設置以下五種類型(demo中使用的第二種):
注意:此demo在原生Android系統上沒問題,但在國內大多數定製機上,如果關閉後臺,鬧鈴一般不會觸發 ╮(╯_╰)╭
demo下載地址:http://download.csdn.net/detail/youmingyu/9715802
MainAvtivity:
package fk.androiddemo_030;
import android.app.Activity;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.Intent;
import android.os.Bundle;
import android.os.SystemClock;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
public class MainActivity extends Activity {
Button setAlarmBut,cancelAlarmBut;
EditText keyEdit,timeEdit;
int alarmKey, alarmTime;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
keyEdit=(EditText)findViewById(R.id.keyEdit);
timeEdit=(EditText)findViewById(R.id.timeEdit);
setAlarmBut = (Button) findViewById(R.id.setAlarmBut);
setAlarmBut.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
alarmKey=Integer.parseInt(keyEdit.getText().toString().trim());
alarmTime=Integer.parseInt(timeEdit.getText().toString().trim());
alarmTime=alarmTime*1000;//換成毫秒
Intent intent = new Intent(MainActivity.this, AlarmService.class);
//Intent intent = new Intent(MainActivity.this, AlarmReceiver.class);
intent.putExtra("alarmKey",alarmKey);
//PendingIntent還可以用getActivity()直接啓動Activity
PendingIntent sender = PendingIntent.getService(MainActivity.this, alarmKey, intent, 0);
//PendingIntent sender = PendingIntent.getBroadcast(MainActivity.this, alarmKey, intent, 0);
long firstTime = SystemClock.elapsedRealtime(); // 開機之後到現在的運行時間(包括睡眠時間)
firstTime += alarmTime;
// 進行鬧鈴註冊
AlarmManager manager = (AlarmManager) getSystemService(ALARM_SERVICE);
//manager.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, firstTime, 3000, sender);//重複鬧鐘
manager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, firstTime, sender);
Toast.makeText(MainActivity.this, "設置"+alarmKey+"號鬧鈴", Toast.LENGTH_LONG).show();
//MainActivity.this.finish();
}
});
cancelAlarmBut = (Button) findViewById(R.id.cancelAlarmBut);
cancelAlarmBut.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
alarmKey=Integer.parseInt(keyEdit.getText().toString().trim());
Intent intent = new Intent(MainActivity.this, AlarmService.class);
//Intent intent = new Intent(MainActivity.this, AlarmReceiver.class);
PendingIntent sender = PendingIntent.getService(MainActivity.this, alarmKey, intent, 0);
//PendingIntent sender = PendingIntent.getBroadcast(MainActivity.this, alarmKey, intent, 0);
AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
am.cancel(sender);// 取消鬧鈴
Toast.makeText(MainActivity.this, "取消"+alarmKey+"號鬧鈴", Toast.LENGTH_LONG).show();
//MainActivity.this.finish();
}
});
}
}
AlarmService:
package fk.androiddemo_030;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.widget.Toast;
public class AlarmService extends Service {
public AlarmService() {
}
@Override
public IBinder onBind(Intent intent) {
// TODO: Return the communication channel to the service.
throw new UnsupportedOperationException("Not yet implemented");
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
int alarmKey=intent.getIntExtra("alarmKey",-1);
Toast.makeText(ContextUtil.getInstance(), alarmKey+"號鬧鈴響了, 可以做點事情了~~AlarmService", Toast.LENGTH_LONG).show();
return super.onStartCommand(intent, flags, startId);
}
}
AlarmReceiver:
package fk.androiddemo_030;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;
public class AlarmReceiver extends BroadcastReceiver {
public AlarmReceiver() {}
@Override
public void onReceive(Context context, Intent intent) {
// TODO: This method is called when the BroadcastReceiver is receiving
int alarmKey=intent.getIntExtra("alarmKey",-1);
Toast.makeText(context, alarmKey+"號鬧鈴響了, 可以做點事情了~~AlarmReceiver", Toast.LENGTH_LONG).show();
}
}
運行截圖: