鬧鐘的簡單實現,只有顯示時間和設置鬧鐘。
AlarmView
package com.example.lenovo.clock2;  import android.app.AlarmManager; import android.app.PendingIntent; import android.app.TimePickerDialog; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.SharedPreferences; import android.icu.util.Calendar; import android.os.Build; import android.support.annotation.Nullable; import android.support.annotation.RequiresApi; import android.support.v7.app.AlertDialog; import android.util.AttributeSet; import android.view.View; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.LinearLayout; import android.widget.ListView; import android.widget.TimePicker;  import java.util.Date;  /**  * Created by lenovo on 2017/11/20.  */ //鬧鐘 public class AlarmView extends LinearLayout { // public AlarmView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { //  super(context, attrs, defStyleAttr); // }   public AlarmView(Context context, @Nullable AttributeSet attrs) {   super(context, attrs);   init();  }  public AlarmView(Context context) {   super(context);   init();  }   private void init(){   alarmManager= (AlarmManager) getContext().getSystemService(Context.ALARM_SERVICE);  }   @RequiresApi(api = Build.VERSION_CODES.N)  @Override  protected void onFinishInflate() {   super.onFinishInflate();    btnAddAlarm=findViewById(R.id.btnAddAlarm);   lvAlarmList=findViewById(R.id.lvAlarmList);    adapter=new ArrayAdapter<AlarmView.AlarmData>(getContext(),R.layout.support_simple_spinner_dropdown_item);   lvAlarmList.setAdapter(adapter);   readSavedAlarmList();    //adapter.add(new AlarmData(System.currentTimeMillis()));    btnAddAlarm.setOnClickListener(new OnClickListener() {    @RequiresApi(api = Build.VERSION_CODES.N)    @Override    public void onClick(View view) {     addAlarm();    }   });    lvAlarmList.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener(){    @Override    public boolean onItemLongClick(AdapterView<?> adapterView, View view, final int position, long id) {     new AlertDialog.Builder(getContext()).setTitle("操作選項").setItems(new CharSequence[]{"刪除"}, new DialogInterface.OnClickListener() {      @Override      public void onClick(DialogInterface dialogInterface, int which) {       switch (which){        case 0:         deleteAlarm(position);         break;        default:         break;       }      }     }).setNegativeButton("取消",null).show();     return true;    }   });   }   private void deleteAlarm(int position){    AlarmData ad=adapter.getItem(position);   adapter.remove(ad);   saveAlarmList();//重新保存   alarmManager.cancel(PendingIntent.getBroadcast(getContext(),ad.getId(),new Intent(getContext(),AlarmReceiver.class),0));  }  @RequiresApi(api = Build.VERSION_CODES.N)  private void addAlarm(){   //獲取當前時間   Calendar c=Calendar.getInstance();   //時間選擇框   new TimePickerDialog(getContext(), new TimePickerDialog.OnTimeSetListener() {    @Override    public void onTimeSet(TimePicker view, int hourOfDay, int minute) {     Calendar calendar =Calendar.getInstance();     calendar.set(Calendar.HOUR_OF_DAY,hourOfDay);     calendar.set(Calendar.MINUTE,minute);     calendar.set(Calendar.SECOND,0);     calendar.set(Calendar.MILLISECOND,0);       //寫出當前時間     Calendar currentTime=Calendar.getInstance();      //設置時間小于當前時間,往后推一天     if(calendar.getTimeInMillis()<=currentTime.getTimeInMillis()){      calendar.setTimeInMillis(calendar.getTimeInMillis()+24*60*60*1000);     }      AlarmData ad=new AlarmData(calendar.getTimeInMillis());     adapter.add(ad);   /* 第一個參數 RTC操作系統時間為啟動時間點,WAKEUP系統休眠時同樣執行 第二個參數 什么時候啟動 第三個參數 啟動之后什么時間再次啟動 第四個參數 Pendingintent掛起的Intent,不立即執行 */     alarmManager.setRepeating(AlarmManager.RTC_WAKEUP,       ad.getTime(),//當前時間當做請求碼       5*60*1000,       //執行廣播       PendingIntent.getBroadcast(getContext(),         ad.getId(),         new Intent(getContext(),           AlarmReceiver.class),         0));  //每一個鬧鐘對應一個請求碼,根據請求碼移除特定的鬧鐘,那么把時間當做請求碼     saveAlarmList();    }   },c.get(Calendar.HOUR_OF_DAY),c.get(Calendar.MINUTE),true).show();   }  //保存鬧鐘數據  private void saveAlarmList(){   SharedPreferences.Editor editor=getContext().getSharedPreferences(AlarmView.class.getName(),Context.MODE_PRIVATE).edit();    StringBuffer sb=new StringBuffer();   for(int i=0;i<adapter.getCount();i++){    sb.append(adapter.getItem(i).getTime()).append(",");    }    if(sb.length()>1){    String content=sb.toString().substring(0,sb.length()-1);//去掉最后一個逗號    editor.putString(KEY_ALARM_LIST,content);   }else{    editor.putString(KEY_ALARM_LIST,null);   }   editor.commit();  }  //讀取已存數據   @RequiresApi(api = Build.VERSION_CODES.N)  private void readSavedAlarmList(){    SharedPreferences sp=getContext().getSharedPreferences((AlarmView.class.getName()), Context.MODE_PRIVATE);   String content=sp.getString(KEY_ALARM_LIST,null);     if(content!=null){    String[] timeStrings=content.split(",");    for(String string:timeStrings){     adapter.add(new AlarmData(Long.parseLong(string)));      }   }   }    private static final String KEY_ALARM_LIST="alarmList";  private Button btnAddAlarm;  private ListView lvAlarmList;  private ArrayAdapter<AlarmData> adapter;  private AlarmManager alarmManager;//系統的鬧鐘服務  private static class AlarmData{    //鬧鐘所要響起的時間   @RequiresApi(api = Build.VERSION_CODES.N)   public AlarmData(long time){    this.time=time;     date= Calendar.getInstance();    date.setTimeInMillis(time);     timeLable=String.format("%d月%d日 %d:%d",      date.get(Calendar.MONTH)+1,//getMonth的返回值是從0開始的      date.get(Calendar.DAY_OF_MONTH),      date.get(Calendar.HOUR_OF_DAY),      date.get(Calendar.MINUTE));   }   public long getTime(){    return time;   }   public String getTimeLable(){    return timeLable;   }    @Override   public String toString() {    return getTimeLable();   }   public int getId(){    return (int)(getTime()/1000/60);//精確到分鐘,getTime為毫秒   }     //獲取時間的標簽   private String timeLable="";   private long time=0;   private Calendar date;    } } TimeView
package com.example.lenovo.clock2;  import android.content.Context; import android.icu.util.Calendar; import android.os.Build; import android.os.Handler; import android.os.Message; import android.support.annotation.IntDef; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.annotation.RequiresApi; import android.util.AttributeSet; import android.view.View; import android.widget.LinearLayout; import android.widget.TextView;  /**  * Created by lenovo on 2017/11/20.  */ //時鐘 顯示目前的時間 public class TimeView extends LinearLayout {  public TimeView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {   super(context, attrs, defStyleAttr);  }  public TimeView(Context context, @Nullable AttributeSet attrs) {   super(context, attrs);  }   public TimeView(Context context) {   super(context);  }   @Override   protected void onFinishInflate() {   super.onFinishInflate();    tvTime=findViewById(R.id.tvTime);   tvTime.setText("這里顯示時間");    timerHander.sendEmptyMessage(0);   }  //判斷可見屬性是否發生改變  @Override  protected void onVisibilityChanged(View changedView, int visibility) {   super.onVisibilityChanged(changedView, visibility);   if(getVisibility()== View.VISIBLE){    timerHander.sendEmptyMessage(0);//可見,則呈現   }else{    timerHander.removeMessages(0);//否則移除所有消息   }  }   //刷新時間  @RequiresApi(api = Build.VERSION_CODES.N)  private void refreshTime(){   Calendar c=Calendar.getInstance();   tvTime.setText(String.format("%d:%d:%d",c.get(Calendar.HOUR_OF_DAY),c.get(Calendar.MINUTE),c.get(Calendar.SECOND)));   }  //Hander每隔一秒執行一次  private Handler timerHander=new Handler(){    @RequiresApi(api = Build.VERSION_CODES.N)   @Override   public void handleMessage(Message msg) {     refreshTime();    //若為當前頁面,則刷新;否則,沒有必要刷新    if (getVisibility()== View.VISIBLE) {     timerHander.sendEmptyMessageDelayed(0, 1000);//1000毫秒后再執行handleMessage方法    }   };  };  private TextView tvTime; } AlarmReceiver
package com.example.lenovo.clock2;  import android.app.AlarmManager; import android.app.PendingIntent; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent;  /**  * Created by lenovo on 2017/11/23.  */  public class AlarmReceiver extends BroadcastReceiver {  @Override  public void onReceive(Context context, Intent intent) {    AlarmManager am= (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);   am.cancel(PendingIntent.getBroadcast(context,getResultCode(),new Intent(context,AlarmReceiver.class),0));   Intent i=new Intent(context,PlayAlarmAty.class);  i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);  context.startActivity(i);   } } MainActivity
package com.example.lenovo.clock2;  import android.app.Activity; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.widget.TabHost;  public class MainActivity extends Activity {   @Override  protected void onCreate(Bundle savedInstanceState) {   super.onCreate(savedInstanceState);   setContentView(R.layout.activity_main);    tabHost= (TabHost) findViewById(R.id.tabhost);   tabHost.setup(); //setContent()為聲明內容   tabHost.addTab(tabHost.newTabSpec("tabTime").setIndicator("時鐘").setContent(R.id.tabTime));   tabHost.addTab(tabHost.newTabSpec("tabAlarm").setIndicator("鬧鐘").setContent(R.id.tabAlarm));   tabHost.addTab(tabHost.newTabSpec("tabTimer").setIndicator("計時器").setContent(R.id.tabTimer));   tabHost.addTab(tabHost.newTabSpec("tabStopWatch").setIndicator("秒表").setContent(R.id.tabStopWatch));  }  private TabHost tabHost; } PlayAlarmAty
package com.example.lenovo.clock2;  import android.app.Activity; import android.media.MediaPlayer; import android.os.Bundle; import android.support.annotation.Nullable;  /**  * Created by lenovo on 2017/11/25.  */  public class PlayAlarmAty extends Activity {  @Override  protected void onCreate(@Nullable Bundle savedInstanceState) {   super.onCreate(savedInstanceState);   setContentView(R.layout.alarm_player_aty);    mp=MediaPlayer.create(this,R.raw.mine);   mp.start();   }   @Override  protected void onPause() {   super.onPause();   finish();  }   @Override  protected void onDestroy() {   super.onDestroy();   mp.stop();   mp.release();   }   private MediaPlayer mp;  //音樂播放器 } 運行效果圖
	
	
	
	
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。
新聞熱點
疑難解答