Android 闹钟
比如:一次闹钟响过之后开关变为关的状态;直接点击开关不能实现开关闹钟的作用,需要在点击item的菜单中进行更改;未知原因闹钟不准时,不能及时响应,求大神讲解
话不多说,看代码
MainActivity
import android.app.Activity;
import android.app.AlarmManager;
import android.app.AlertDialog;
import android.app.PendingIntent;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.View;
import android.widget.AdapterView;
import android.widget.CompoundButton;
import android.widget.ImageButton;
import android.widget.ListView;
import android.widget.Switch;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
public class MainActivity extends Activity implements View.OnClickListener {
private ImageButton add;
private ListView alarm;
private Switch open;
private Boolean kai;
public String aaa;
public String clockTime;
public int id;
private String myhour;
private String myminute;
private List<AlarmItem> adapterList = new ArrayList<AlarmItem>();
public AlarmItemAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate( savedInstanceState );
setContentView( R.layout.main );
init();
adapter = new AlarmItemAdapter( this, R.layout.alarm_item, adapterList );
alarm.setAdapter( adapter );//关联适配器
readSavedAlarmList();//读取闹钟列表
}
private void init() {
add = (ImageButton) findViewById( R.id.add );
alarm = (ListView) findViewById( R.id.alarm );
add.setOnClickListener( this );
alarm.setOnItemClickListener( new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, final int position, long id) {
ShowListItem( position );
}
} );
}
public void ShowListView() {
if (aaa != null && clockTime != null) {
AlarmItem alarmItem = new AlarmItem( aaa, clockTime, kai );
adapterList.add( alarmItem );
adapter.notifyDataSetChanged(); //通知数据集更改
int id = Integer.parseInt( myhour + myminute ); // id为当前设置闹钟的时间
openAlarm( id );
saveAlarmList();//保存闹钟列表
}
}
private void openAlarm(int id) {
AlarmManager alarmManager = (AlarmManager) getSystemService( ALARM_SERVICE );
PendingIntent pi = PendingIntent.getBroadcast( MainActivity.this, id, new Intent( MainActivity.this, AlarmReceiver.class ), 0 );
Toast.makeText( this, String.valueOf( id ), Toast.LENGTH_SHORT ).show();
Calendar c = Calendar.getInstance();
c.setTimeInMillis( System.currentTimeMillis() );
c.set( Calendar.HOUR_OF_DAY, Integer.parseInt( myhour ) );
c.set( Calendar.MINUTE, Integer.parseInt( myminute ) );
if (kai.equals( true )) {
if (aaa.equals( "只响一次" )) {
if (c.getTimeInMillis() > System.currentTimeMillis()) {//获取时间大于当前时间,按设置事件进行闹钟
alarmManager.set( AlarmManager.RTC_WAKEUP, c.getTimeInMillis(), pi );
} else {//否则,第二天这个时间进行闹钟
alarmManager.set( AlarmManager.RTC_WAKEUP, c.getTimeInMillis() + 24 * 60 * 60 * 1000, pi );
}
} else if (aaa.equals( "每天" )) {
alarmManager.setRepeating( AlarmManager.RTC_WAKEUP, c.getTimeInMillis(), 24 * 60 * 60 * 1000, pi );
}
}
}
public void ShowListItem(final int position) {
AlertDialog.Builder builder = new AlertDialog.Builder( this );
builder.setTitle( "操作选项" );
builder.setItems( new CharSequence[]{"删除闹钟", "开启/关闭闹钟"}, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
switch (which) {
case 0:
deleteAlarm( position );
break;
case 1:
switchAlarm( position );
break;
}
}
} );
builder.show();
}
private void switchAlarm(final int position) {
open = (Switch) findViewById( R.id.open );
if (adapter.getItem( position ).getKai() == false) {
adapter.getItem( position ).setKai( true );
//开启闹钟
int id = Integer.parseInt( adapter.getItem( position ).getClock().replace( ":", "" ) );
//开关为开的情况下设置闹钟,id相同会覆盖掉之前的
AlarmManager alarmManager = (AlarmManager) getSystemService( ALARM_SERVICE );
PendingIntent pi = PendingIntent.getBroadcast( MainActivity.this, id, new Intent( MainActivity.this, AlarmReceiver.class ), 0 );
Calendar c = Calendar.getInstance();
c.setTimeInMillis( System.currentTimeMillis() );
String hour= String.valueOf(adapter.getItem( position ).getClock().charAt( 0 )) + adapter.getItem( position ).getClock().charAt( 1 ) ;
String minute=String.valueOf( adapter.getItem( position ).getClock().charAt( 3 ) )+adapter.getItem( position ).getClock().charAt( 4 );
Toast.makeText( this, "hour"+hour+"miute"+minute, Toast.LENGTH_SHORT ).show();