本篇通過AlarmManager和PendingIntent實現定時提醒功能,界面運用Button、TextView、Switch進行佈局
同時這也是中國大學慕課移動終端應用開發的網課作業18,我會持續更新我的作業,如果有需要關注一下吧
說明
具體的組件介紹請點擊上面鏈接,觀看課程內詳細信息,這裏不多贅述,只貼我實現的代碼。
界面展示
代碼部分
代碼包括時間設置Activity—TimePickerActivity和其對應佈局以及鬧鐘Activity—MyClockActivity
1.先在AndroidManifest.xml中設置權限
同時記得註冊Activity
<uses-permission android:name="android.permission.VIBRATE" />
2.TimePickerActivity.java
public class TimePickerActivity extends AppCompatActivity {
private Button mButtonChooseTime,mButtonStart,mButtonCancel;
private TextView mTextView;
private Switch mSwitch;
private boolean flag = false;//是否應該震動
private PendingIntent mPendingIntent;
private AlarmManager mAlarmManager;
private Intent mIntent;
private int requestCode = 0;
private Calendar mCalendar;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_time_picker);
init();
mButtonChooseTime.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//用於存放當前時間
Calendar currentTime = Calendar.getInstance();
new TimePickerDialog(TimePickerActivity.this, new TimePickerDialog.OnTimeSetListener() {
@Override
public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
mCalendar = Calendar.getInstance();
long systemTime = System.currentTimeMillis();//取出當前的時間毫秒值
mCalendar.set(Calendar.HOUR,hourOfDay);
mCalendar.set(Calendar.MINUTE,minute);
mCalendar.set(Calendar.SECOND,0);
mCalendar.set(Calendar.MILLISECOND,0);
long setTime = mCalendar.getTimeInMillis();
if (systemTime>setTime){
mCalendar.add(Calendar.DAY_OF_MONTH,1);
}
mTextView.setText("您選擇了"+hourOfDay+"時"+minute+"分");
}
}, currentTime.get(Calendar.HOUR_OF_DAY), currentTime.get(Calendar.MINUTE), false).show();
}
});
mButtonStart.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mAlarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
mIntent = MyClockActivity.createIntent(TimePickerActivity.this,flag);
mPendingIntent = PendingIntent.getActivity(TimePickerActivity.this,requestCode,mIntent,PendingIntent.FLAG_UPDATE_CURRENT);
//設置鬧鈴
mAlarmManager.setExact(AlarmManager.RTC,mCalendar.getTimeInMillis(),mPendingIntent);
mButtonStart.setEnabled(false);
mButtonCancel.setEnabled(true);
}
});
mButtonCancel.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mAlarmManager.cancel(mPendingIntent);
mButtonStart.setEnabled(true);
mButtonCancel.setEnabled(false);
}
});
mSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener(){
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
flag = isChecked;
mButtonStart.setEnabled(true);
mButtonCancel.setEnabled(false);
}
});
}
private void init(){
mButtonChooseTime = findViewById(R.id.time_picker_button_choose_time);
mButtonStart = findViewById(R.id.time_picker_button_start);
mButtonCancel = findViewById(R.id.time_picker_button_cancel);
mTextView = findViewById(R.id.time_picker_text_show_info);
mSwitch = findViewById(R.id.time_picker_switch_choose);
mButtonStart.setEnabled(false);
mButtonCancel.setEnabled(false);
}
}
2.activity_time_picker.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:id="@+id/time_picker_text_show_info"
android:layout_gravity="center"
android:layout_marginTop="30dp"
android:textSize="20dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<Button
android:id="@+id/time_picker_button_choose_time"
android:layout_gravity="center"
android:layout_marginTop="30dp"
android:text="選擇時間"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<LinearLayout
android:layout_gravity="center"
android:layout_marginTop="30dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:text="是否震動 "
android:textSize="20dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<Switch
android:id="@+id/time_picker_switch_choose"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
<Button
android:layout_gravity="center"
android:layout_marginTop="30dp"
android:id="@+id/time_picker_button_start"
android:text="開啓定時"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<Button
android:layout_gravity="center"
android:layout_marginTop="30dp"
android:id="@+id/time_picker_button_cancel"
android:text="取消定時"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
3.MyClockActivity.java
public class MyClockActivity extends AppCompatActivity {
private MediaPlayer mMediaPlayer;
private boolean flag;
private Vibrator mVibrator;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_my_clock);
//獲取傳遞過來的信息
flag = getIntent().getBooleanExtra("flag",false);
mMediaPlayer = MediaPlayer.create(this,R.raw.music);
mMediaPlayer.start();
// 彈出一個鬧鐘提醒對話框---關閉鬧鐘,讓播放鬧鐘的media play停止播放聲音
new AlertDialog.Builder(this)
.setTitle("鬧鐘")
.setMessage("時間到了")
.setPositiveButton("關閉鬧鐘", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
mMediaPlayer.stop();
if (flag){
mVibrator.cancel();
}
MyClockActivity.this.finish();
}
}).show();
if (flag){
//震動
mVibrator = (Vibrator) MyClockActivity.this.getSystemService(MyClockActivity.VIBRATOR_SERVICE);
long [] patter = {1000, 1000, 2000, 50};
mVibrator.vibrate(patter, 0);
}
}
public static Intent createIntent(Context context,boolean flag){
Intent intent = new Intent(context,MyClockActivity.class);
intent.putExtra("flag",flag);
return intent;
}
}
鈴聲資源
在res下新建一個raw文件夾,將音頻文件放入,命名爲music.xxx
總結
如果有什麼問題,請私信聯繫我或者在評論區留言
碼字不易,若有幫助,給個關注和讚唄