android 備忘錄之簡單實現
阿新 • • 發佈:2019-01-01
首先建立儲存備忘錄資訊的表:
DbHelper.java
package com.cjq.androidbwl; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteDatabase.CursorFactory; import android.database.sqlite.SQLiteOpenHelper; /** * * @author cjianquan * @since 2014年10月31日 */ public class DbHelper extends SQLiteOpenHelper { public DbHelper(Context context, String name, CursorFactory factory, int version) { super(context, name, factory, version); // TODO Auto-generated constructor stub } @Override public void onCreate(SQLiteDatabase db) { StringBuilder sql = new StringBuilder(); sql.append("create table if not exists tb_bwl(") .append("id integer primary key autoincrement,") .append("title varchar(50),") .append("content varchar(200),") .append("createDate varchar(10),") .append("noticeDate varchar(10),") .append("noticeTime varchar(5) )"); db.execSQL(sql.toString()); } @Override public void onUpgrade(SQLiteDatabase arg0, int arg1, int arg2) { // TODO Auto-generated method stub } }
MainActivity.java
package com.cjq.androidbwl; import java.util.Calendar; import android.app.Activity; import android.app.AlarmManager; import android.app.Dialog; import android.app.PendingIntent; import android.app.TimePickerDialog; import android.content.Context; import android.content.Intent; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.os.Bundle; import android.util.Log; import android.view.ContextMenu; import android.view.ContextMenu.ContextMenuInfo; import android.view.MenuItem; import android.view.View; import android.widget.AdapterView; import android.widget.AdapterView.AdapterContextMenuInfo; import android.widget.AdapterView.OnItemClickListener; import android.widget.ImageButton; import android.widget.ListView; import android.widget.SimpleCursorAdapter; import android.widget.TextView; import android.widget.TimePicker; import android.widget.Toast; /** * * @author cjianquan * @since 2014年10月31日 */ public class MainActivity extends Activity { private AlarmManager alarmManager=null; Calendar cal=Calendar.getInstance(); final int DIALOG_TIME = 0; //設定對話方塊id private DbHelper dbhelper; private SQLiteDatabase db; SimpleCursorAdapter adapter = null; ListView lv; /* (non-Javadoc) * @see android.app.Activity#onCreate(android.os.Bundle) */ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); alarmManager=(AlarmManager)getSystemService(Context.ALARM_SERVICE); dbhelper = new DbHelper(this, "db_bwl", null, 1); db = dbhelper.getReadableDatabase(); Cursor cursor = db.query("tb_bwl", new String[]{"id as _id","title","content","noticeDate","noticeTime"}, null, null, null, null,null); lv = (ListView)findViewById(R.id.lv_bwlList); adapter = new SimpleCursorAdapter(this, R.layout.list_item_bwl, cursor, new String[]{"title","noticeDate","noticeTime","content"}, new int[]{R.id.title,R.id.noticeDate,R.id.noticeTime,R.id.content}); // ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_expandable_list_item_1, getDatas()); lv.setAdapter(adapter); this.registerForContextMenu(lv); lv.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { String title = ((TextView)view.findViewById(R.id.title)).getText().toString(); String content = ((TextView)view.findViewById(R.id.content)).getText().toString(); String noticeDate = ((TextView)view.findViewById(R.id.noticeDate)).getText().toString(); String noticeTime = ((TextView)view.findViewById(R.id.noticeTime)).getText().toString(); Intent intent = new Intent(); intent.setClass(MainActivity.this,AddBwlActivity.class); Bundle bundle = new Bundle(); bundle.putLong("id", id); bundle.putString("title", title); bundle.putString("content", content); bundle.putString("noticeDate", noticeDate); bundle.putString("noticeTime", noticeTime); intent.putExtras(bundle); startActivity(intent); } }); //新增備忘錄按鈕 ImageButton btnAdd = (ImageButton)findViewById(R.id.btnAdd); btnAdd.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Intent intent = new Intent(MainActivity.this,AddBwlActivity.class); startActivity(intent); } }); // //建立兩個Intent,一個是用於AlarmReceiver類處理的,一個是用於廣播的 // AlarmManager am = (AlarmManager)getSystemService(Context.ALARM_SERVICE); // Intent intent = new Intent(MainActivity.this,AlarmReceiver.class); // intent.setAction("ALARM_ACTION"); // PendingIntent pendingIntent = PendingIntent.getBroadcast(MainActivity.this, 0, intent, 0); // // //設定真正能讓alarm起作用的引數 // //設定alarm是以何種方式發生的,這裡用的是以UTC時間為基準,並在alarm發生時同時喚醒裝置的模式。 // am.set(AlarmManager.RTC_WAKEUP,System.currentTimeMillis(),pendingIntent); // am.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + 10*1000, 60*60*1000, pendingIntent); } //長按的上下文選單 public void onCreateContextMenu(ContextMenu menu,View view,ContextMenuInfo menuInfo){ menu.setHeaderIcon(R.drawable.alarm); menu.add(0,3,0,"修改"); menu.add(0,4,0,"刪除"); } public boolean onContextItemSelected(MenuItem item){ AdapterContextMenuInfo menuInfo = (AdapterContextMenuInfo)item.getMenuInfo(); switch(item.getItemId()){ case 3: String title = ((TextView)menuInfo.targetView.findViewById(R.id.title)).getText().toString(); String content = ((TextView)menuInfo.targetView.findViewById(R.id.content)).getText().toString(); String noticeDate = ((TextView)menuInfo.targetView.findViewById(R.id.noticeDate)).getText().toString(); String noticeTime = ((TextView)menuInfo.targetView.findViewById(R.id.noticeTime)).getText().toString(); Intent intent = new Intent(); intent.setClass(this,AddBwlActivity.class); Bundle bundle = new Bundle(); bundle.putLong("id", menuInfo.id); bundle.putString("title", title); bundle.putString("content", content); bundle.putString("noticeDate", noticeDate); bundle.putString("noticeTime", noticeTime); intent.putExtras(bundle); startActivity(intent); break; case 4: dbhelper = new DbHelper(this, "db_bwl", null, 1); db = dbhelper.getWritableDatabase(); int status = db.delete("tb_bwl", "id=?", new String[]{""+menuInfo.id}); if(status!=-1){ //刪除後更新listview Cursor cursor = db.query("tb_bwl", new String[]{"id as _id","title","content","noticeDate","noticeTime"}, null, null, null, null,null); adapter.changeCursor(cursor); // adapter.notifyDataSetChanged(); Toast.makeText(this, "刪除成功", Toast.LENGTH_LONG).show(); }else{ Toast.makeText(this, "刪除失敗", Toast.LENGTH_LONG).show(); } break; } return true; } @Override protected Dialog onCreateDialog(int id) { Dialog dialog=null; switch (id) { case DIALOG_TIME: dialog=new TimePickerDialog( this, new TimePickerDialog.OnTimeSetListener(){ public void onTimeSet(TimePicker timePicker, int hourOfDay,int minute) { Calendar c=Calendar.getInstance();//獲取日期物件 c.setTimeInMillis(System.currentTimeMillis()); //設定Calendar物件 c.set(Calendar.HOUR, hourOfDay); //設定鬧鐘小時數 c.set(Calendar.MINUTE, c.get(Calendar.MINUTE)+1); //設定鬧鐘的分鐘數 c.set(Calendar.SECOND, 0); //設定鬧鐘的秒數 c.set(Calendar.MILLISECOND, 0); //設定鬧鐘的毫秒數 Intent intent = new Intent(MainActivity.this, AlarmReceiver.class); //建立Intent物件 // intent.setAction("ALARM_ACTION"); PendingIntent pi = PendingIntent.getBroadcast(MainActivity.this, 0, intent, 0); //建立PendingIntent //引數說明:http://www.eoeandroid.com/blog-119358-2995.html alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis()+30000, pi); //設定鬧鐘,當前時間就喚醒 Toast.makeText(MainActivity.this, "鬧鐘設定成功", Toast.LENGTH_LONG).show();//提示使用者 } }, cal.get(Calendar.HOUR_OF_DAY), cal.get(Calendar.MINUTE), true); break; } Log.e("AndroidBWL", "onCreateDialog end..."); return dialog; } @Override protected void onResume() { super.onResume(); Cursor cursor = db.query("tb_bwl", new String[]{"id as _id","title","content","noticeDate","noticeTime"}, null, null, null, null,null); adapter.changeCursor(cursor); } }
新增activity
AddBwlActivity.java
package com.cjq.androidbwl; import java.util.Calendar; import java.util.Date; import android.app.Activity; import android.app.AlarmManager; import android.app.DatePickerDialog; import android.app.PendingIntent; import android.app.DatePickerDialog.OnDateSetListener; import android.app.Dialog; import android.app.TimePickerDialog; import android.app.TimePickerDialog.OnTimeSetListener; import android.content.ContentValues; import android.content.Context; import android.content.Intent; import android.database.sqlite.SQLiteDatabase; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.DatePicker; import android.widget.EditText; import android.widget.TimePicker; import android.widget.Toast; /** * * @author cjianquan * @since 2014年10月31日 */ public class AddBwlActivity extends Activity { private EditText etDate = null,etTime=null,etTitle=null,etContent=null; private Button btnSave = null; static final int DATE_DIALOG_ID = 0; static final int TIME_DIALOG_ID = 1; private DbHelper dbhelper; Bundle bundle; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.add_bwl); dbhelper = new DbHelper(this, "db_bwl", null, 1); etTitle = (EditText)findViewById(R.id.etTitle); etContent = (EditText)findViewById(R.id.etContent); etDate = (EditText)findViewById(R.id.etDate); etDate.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { //並會呼叫 onCreateDialog(int)回撥函式來請求一個Dialog showDialog(DATE_DIALOG_ID); } }); etTime = (EditText)findViewById(R.id.etTime); etTime.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { //並會呼叫 onCreateDialog(int)回撥函式來請求一個Dialog showDialog(TIME_DIALOG_ID); } }); btnSave = (Button)findViewById(R.id.btnSave); btnSave.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { ContentValues value = new ContentValues(); String title = etTitle.getText().toString(); String content = etContent.getText().toString(); String noticeDate = etDate.getText().toString(); String noticeTime = etTime.getText().toString(); value.put("title", title); value.put("content", content); value.put("noticeDate", noticeDate); value.put("noticeTime", noticeTime); SQLiteDatabase db = dbhelper.getWritableDatabase(); long id = 0; long status = 0; if(bundle!=null){ id = bundle.getLong("id"); status = db.update("tb_bwl", value, "id=?", new String[]{bundle.getLong("id")+""}); }else{ status = db.insert("tb_bwl", null, value); id = status; } if(status!=-1){ setAlarm(id); Toast.makeText(AddBwlActivity.this, "儲存成功", Toast.LENGTH_LONG).show(); }else{ Toast.makeText(AddBwlActivity.this, "儲存失敗", Toast.LENGTH_LONG).show(); } } }); //獲取上一個activity的傳值 bundle = this.getIntent().getExtras(); if(bundle!=null){ etDate.setText(bundle.getString("noticeDate")); etTime.setText(bundle.getString("noticeTime")); etTitle.setText(bundle.getString("title")); etContent.setText(bundle.getString("content")); } } private OnDateSetListener dateSetListener = new OnDateSetListener() { @Override public void onDateSet(DatePicker datePicker, int year, int month, int day) { StringBuilder dateStr = new StringBuilder(); dateStr.append(year).append("-") .append(month+1).append("-") .append(day); etDate.setText(dateStr.toString()); } }; private OnTimeSetListener timeSetListener = new OnTimeSetListener() { @Override public void onTimeSet(TimePicker timePicker, int hour, int minute) { StringBuilder timeStr = new StringBuilder(); timeStr.append(hour).append(":") .append(minute); etTime.setText(timeStr.toString()); } }; /** * 當Activity呼叫showDialog函式時會觸發該函式的呼叫 */ protected Dialog onCreateDialog(int id){ Calendar cal = Calendar.getInstance(); cal.setTime(new Date()); switch(id){ case DATE_DIALOG_ID: DatePickerDialog dpd = new DatePickerDialog(this,dateSetListener, cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), cal.get(Calendar.DAY_OF_MONTH)); dpd.setCancelable(true); dpd.setTitle("選擇日期"); dpd.show(); break; case TIME_DIALOG_ID: TimePickerDialog tpd = new TimePickerDialog(this, timeSetListener, cal.get(Calendar.HOUR_OF_DAY), cal.get(Calendar.MINUTE), true); tpd.setCancelable(true); tpd.setTitle("選擇時間"); tpd.show(); break; default: break; } return null; } private AlarmManager alarmManager=null; public void setAlarm(long id){ Log.e("AndroidBWL", "setAlarm start..."); String noticeDate = etDate.getText().toString(); String noticeTime = etTime.getText().toString(); Calendar calendar = Calendar.getInstance(); calendar.set(Integer.parseInt(noticeDate.split("-")[0]), Integer.parseInt(noticeDate.split("-")[1])-1, Integer.parseInt(noticeDate.split("-")[2]), Integer.parseInt(noticeTime.split(":")[0]), Integer.parseInt(noticeTime.split(":")[1])); Log.e("AndroidBWL", ""+(calendar.getTimeInMillis()-System.currentTimeMillis())); alarmManager=(AlarmManager)getSystemService(Context.ALARM_SERVICE); Intent intent = new Intent(AddBwlActivity.this, AlarmReceiver.class); //建立Intent物件 Bundle bundle = new Bundle(); bundle.putLong("id", id); bundle.putString("title", etTitle.getText().toString()); bundle.putString("content", etContent.getText().toString()); bundle.putString("noticeDate", etDate.getText().toString()); bundle.putString("noticeTime", etTime.getText().toString()); intent.putExtras(bundle); //PendingIntent.getBroadcast intent 資料不更新。 //傳不同的 action 來解決這個問題 intent.setAction("ALARM_ACTION"+calendar.getTimeInMillis()); PendingIntent pi = PendingIntent.getBroadcast(AddBwlActivity.this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); //建立PendingIntent //引數說明:http://www.eoeandroid.com/blog-119358-2995.html alarmManager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis()+5000, pi); //設定鬧鐘,當前時間就喚醒 Log.e("AndroidBWL", "setAlarm end..."); } }
提醒的廣播接收:
AlarmReceiver.java
package com.cjq.androidbwl;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
/**
*
* @author cjianquan
* @since 2014年10月29日
*/
public class AlarmReceiver extends BroadcastReceiver {
private Intent mIntent = null;
private PendingIntent mPendingIntent = null;
private Notification mNotification = null;
private NotificationManager mNotificationManager = null;
@Override
public void onReceive(Context context, Intent intent) {
Log.e("AndroidBWL", "AlarmReceiver:onReceive");
mIntent = intent;
Bundle bundle = mIntent.getExtras();
mNotificationManager = (NotificationManager)context.getSystemService(context.NOTIFICATION_SERVICE);
// mIntent = new Intent(context,AddBwlActivity.class);
mIntent.setClass(context,AddBwlActivity.class);
mPendingIntent = PendingIntent.getActivity(context, 0, mIntent, 0);
mNotification = new Notification();
mNotification.icon = R.drawable.alarm;
mNotification.tickerText="備忘錄";
//設定預設聲音、預設振動、和預設閃光燈
mNotification.defaults = Notification.DEFAULT_ALL;
//點選通知後自動取消
mNotification.flags |= Notification.FLAG_AUTO_CANCEL;
mNotification.setLatestEventInfo(context, bundle.getString("title"), bundle.getString("content"), mPendingIntent);
mNotificationManager.notify(1,mNotification);
}
}
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.cjq.androidbwl"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="14"
android:targetSdkVersion="14" />
<application
android:allowBackup="true"
android:icon="@drawable/alarm"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.cjq.androidbwl.MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name="com.cjq.androidbwl.AlarmActivity" />
<activity android:name="com.cjq.androidbwl.NotifitionActivity" />
<activity android:name="com.cjq.androidbwl.AddBwlActivity" />
<receiver android:name="com.cjq.androidbwl.AlarmReceiver" android:process=":remote"></receiver>
</application>
<!-- 新增操作振動器的許可權-->
<uses-permission android:name="android.permission.VIBRATE"></uses-permission>
<!-- 新增操作閃光燈的許可權 -->
<uses-permission android:name="android.permission.FLASHLIGHT"></uses-permission>
</manifest>
佈局檔案:
activity_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:layout_gravity="right"
tools:context=".MainActivity" >
<ImageButton android:id="@+id/btnAdd"
android:paddingLeft="10dp"
android:alpha="70"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/add" />
<ListView android:id="@+id/lv_bwlList"
android:layout_width="match_parent"
android:layout_height="match_parent">
</ListView>
</LinearLayout>
list_item_bwl.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" >
<LinearLayout android:layout_width="match_parent"
android:layout_height="fill_parent"
android:width="0dp"
android:orientation="horizontal"
android:gravity="right">
<TextView
android:id="@+id/title"
android:width="0dp"
android:layout_weight="1.0"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textSize="20sp" />
<TextView android:id="@+id/noticeDate"
android:textSize="10sp"
android:width="0dp"
android:layout_weight="3.0"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
<TextView android:id="@+id/noticeTime"
android:textSize="10sp"
android:width="0dp"
android:layout_weight="3.0"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</LinearLayout>
<TextView android:id="@+id/content"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</LinearLayout>
add_bwl.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:layout_gravity="left"
android:textSize="25sp"
android:orientation="vertical" >
<TextView android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/title"/>
<EditText android:id="@+id/etTitle"
android:hint="請輸入標題"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<TextView android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="日期"/>
<EditText android:id="@+id/etDate"
android:hint="請選擇日期"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<TextView android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="時間"/>
<EditText android:id="@+id/etTime"
android:hint="請選擇時間"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<TextView android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/content"/>
<EditText android:id="@+id/etContent"
android:hint="請輸入內容"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<Button android:id="@+id/btnSave"
android:text="儲存"
android:textSize="40sp"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</LinearLayout>
設定全域性背景圖片:
styles.xml
<resources xmlns:android="http://schemas.android.com/apk/res/android">
<!--
Base application theme, dependent on API level. This theme is replaced
by AppBaseTheme from res/values-vXX/styles.xml on newer devices.
-->
<style name="AppBaseTheme" parent="android:Theme.Light">
<!--
Theme customizations available in newer API levels can go in
res/values-vXX/styles.xml, while customizations related to
backward-compatibility can go here.
-->
</style>
<!-- Application theme. -->
<style name="AppTheme" parent="AppBaseTheme">
<!-- All customizations that are NOT specific to a particular API-level can go here. -->
<item name="android:windowBackground">@drawable/shade</item>
</style>
</resources>