写一份基于Android的简易倒计时APP的设计与实现的代码,需使用广播接收器和SQLite数据库技术,能实现计时器、闹钟、世界时钟和秒表功能
时间: 2024-02-23 09:58:58 浏览: 41
很高兴回答您的问题。以下是一份基于Android的简易倒计时APP的设计与实现的代码:
1. 设计界面
首先,我们需要在布局文件中设计界面。我们可以使用TabLayout和ViewPager来创建不同的选项卡,每个选项卡对应不同的功能。在计时器选项卡中,我们可以使用Chronometer控件来显示倒计时。在闹钟选项卡中,我们可以使用TimePicker控件来设置闹钟时间。在世界时钟选项卡中,我们可以使用Spinner控件来选择不同的城市。在秒表选项卡中,我们可以使用Chronometer控件来显示计时。
2. 编写逻辑代码
接下来,我们需要编写逻辑代码。我们可以使用广播接收器来接收系统发送的闹钟广播,从而触发闹钟功能。我们还可以使用SQLite数据库来存储用户设置的闹钟信息。
我们可以在MainActivity中创建四个Fragment,分别对应不同的选项卡。在每个Fragment中,我们可以编写相应的逻辑代码。
计时器选项卡代码示例:
```
public class TimerFragment extends Fragment {
private Chronometer chronometer;
private Button startButton, pauseButton, resetButton;
public TimerFragment() {}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_timer, container, false);
chronometer = view.findViewById(R.id.chronometer);
startButton = view.findViewById(R.id.start_button);
pauseButton = view.findViewById(R.id.pause_button);
resetButton = view.findViewById(R.id.reset_button);
startButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
chronometer.start();
}
});
pauseButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
chronometer.stop();
}
});
resetButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
chronometer.setBase(SystemClock.elapsedRealtime());
}
});
return view;
}
}
```
闹钟选项卡代码示例:
```
public class AlarmFragment extends Fragment {
private TimePicker timePicker;
private Button setButton, cancelButton;
private AlarmManager alarmManager;
private PendingIntent alarmIntent;
public AlarmFragment() {}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_alarm, container, false);
timePicker = view.findViewById(R.id.time_picker);
setButton = view.findViewById(R.id.set_button);
cancelButton = view.findViewById(R.id.cancel_button);
alarmManager = (AlarmManager) getActivity().getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(getActivity(), AlarmReceiver.class);
alarmIntent = PendingIntent.getBroadcast(getActivity(), 0, intent, 0);
setButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.HOUR_OF_DAY, timePicker.getHour());
calendar.set(Calendar.MINUTE, timePicker.getMinute());
calendar.set(Calendar.SECOND, 0);
long timeInMillis = calendar.getTimeInMillis();
if (System.currentTimeMillis() < timeInMillis) {
alarmManager.set(AlarmManager.RTC_WAKEUP, timeInMillis, alarmIntent);
Toast.makeText(getActivity(), "闹钟设置成功", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(getActivity(), "无效的闹钟时间", Toast.LENGTH_SHORT).show();
}
}
});
cancelButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
alarmManager.cancel(alarmIntent);
Toast.makeText(getActivity(), "闹钟已取消", Toast.LENGTH_SHORT).show();
}
});
return view;
}
}
```
世界时钟选项卡代码示例:
```
public class WorldClockFragment extends Fragment {
private Spinner citySpinner;
private TextView timeTextView;
public WorldClockFragment() {}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_world_clock, container, false);
citySpinner = view.findViewById(R.id.city_spinner);
timeTextView = view.findViewById(R.id.time_text_view);
ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(getActivity(),
R.array.city_array, android.R.layout.simple_spinner_item);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
citySpinner.setAdapter(adapter);
citySpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
String city = parent.getItemAtPosition(position).toString();
TimeZone timeZone = TimeZone.getTimeZone(getTimeZoneId(city));
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
sdf.setTimeZone(timeZone);
String time = sdf.format(new Date());
timeTextView.setText(time);
}
@Override
public void onNothingSelected(AdapterView<?> parent) {}
});
return view;
}
private String getTimeZoneId(String city) {
switch (city) {
case "北京":
return "Asia/Shanghai";
case "伦敦":
return "Europe/London";
case "纽约":
return "America/New_York";
default:
return "";
}
}
}
```
秒表选项卡代码示例:
```
public class StopwatchFragment extends Fragment {
private Chronometer chronometer;
private Button startButton, pauseButton, resetButton;
public StopwatchFragment() {}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_stopwatch, container, false);
chronometer = view.findViewById(R.id.chronometer);
startButton = view.findViewById(R.id.start_button);
pauseButton = view.findViewById(R.id.pause_button);
resetButton = view.findViewById(R.id.reset_button);
startButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
chronometer.setBase(SystemClock.elapsedRealtime());
chronometer.start();
}
});
pauseButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
chronometer.stop();
}
});
resetButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
chronometer.setBase(SystemClock.elapsedRealtime());
}
});
return view;
}
}
```
3. 编写广播接收器
我们需要编写一个广播接收器来接收系统发送的闹钟广播。在接收到广播后,我们可以弹出一个对话框或者播放一个铃声来提醒用户。
```
public class AlarmReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "闹钟响了", Toast.LENGTH_SHORT).show();
}
}
```
4. 编写SQLite数据库代码
我们需要使用SQLite数据库来存储用户设置的闹钟信息。我们可以在创建闹钟时将信息存储到数据库中,在程序启动时读取数据库中的信息并设置闹钟。
```
public class AlarmDbHelper extends SQLiteOpenHelper {
private static final String DATABASE_NAME = "alarm.db";
private static final int DATABASE_VERSION = 1;
public AlarmDbHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("CREATE TABLE alarms (" +
"_id INTEGER PRIMARY KEY," +
"hour INTEGER," +
"minute INTEGER," +
"enabled INTEGER" +
")");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS alarms");
onCreate(db);
}
public Cursor getAlarms() {
SQLiteDatabase db = getReadableDatabase();
return db.query("alarms", null, null, null, null, null, null);
}
public long addAlarm(int hour, int minute, boolean enabled) {
SQLiteDatabase db = getWritableDatabase();
ContentValues values = new ContentValues();
values.put("hour", hour);
values.put("minute", minute);
values.put("enabled", enabled ? 1 : 0);
return db.insert("alarms", null, values);
}
public void deleteAlarm(long id) {
SQLiteDatabase db = getWritableDatabase();
db.delete("alarms", "_id=?", new String[] { String.valueOf(id) });
}
}
```
5. 总结
通过使用广播接收器和SQLite数据库技术,我们可以实现一个功能完善的倒计时APP。在实现过程中,我们需要注意以下几点:
- 在接收系统广播时,需要在AndroidManifest.xml文件中注册相应的广播接收器。
- 在使用SQLite数据库时,需要注意线程安全问题,避免在UI线程中进行数据库操作。
- 在使用闹钟功能时,需要获取系统AlarmManager服务,生成一个PendingIntent对象,并使用AlarmManager.set()方法设置闹钟。
希望这份代码对您有所帮助!
相关推荐
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)