闹钟项目笔记
- 格式:docx
- 大小:76.39 KB
- 文档页数:16
<providerandroid:name="AlarmProvider"android:authorities=".daming.deskclock"android:exported="false" />如果Service等的AndroidManifest中声明为android:exported="false"则该服务不能够跨进程使用<activityandroid:name=".DeskClockMainActivity"android:configChanges="orientation|keyboardHidden|keyboard|nav igation"android:icon="@drawable/clock_launcher"android:label="@string/app_name"android:launchMode="singleInstance"android:theme="@android:style/Theme.Wallpaper.NoTitleBar" > <!-- while docked, this is our home application --><meta-dataandroid:name="android.dock_home"android:value="true"/><intent-filter><actionandroid:name="android.intent.action.MAIN"/><categoryandroid:name="android.intent.category.DESK_DOCK"/><categoryandroid:name="android.intent.category.DEFAULT"/><categoryandroid:name="UNCHER"/></intent-filter></activity>private static class DatabaseHelper extends SQLiteOpenHelper {执行数据插入:@Overridepublic void onCreate(SQLiteDatabase db){// insert default alarmsString insertMe = "insert into alarms"+ "(hour, minutes, daysofweek, alarmtime, enabled, vibrate, message, alert) "+ "VALUES ";db.execSQL(insertMe + "(8, 30, 31, 0, 0, 1, '', '');");db.execSQL(insertMe + "(9, 00, 96, 0, 0, 1, '', '');");}@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int currentVersion){// 数据库版本更新时,删除表alrams;然后重新创建表;db.execSQL("DROP TABLE IF EXISTS alarms");onCreate(db);}}SQLiteDatabase 中参数的介绍:public long insert(String table, String nullColumnHack, ContentValues values)例如:1.SQLiteDatabase db = databaseHelper.getWritableDatabase()2.ContentValues values = new ContentValues();3.values.put("name", "测试数据");4.values.put("age", 4);5.long rowid = db.insert(“person”, null, values);//返回新添记录的行号,与主键id无关不管第三个参数是否包含数据,执行Insert()方法必然会添加一条记录,如果第三个参数为空,会添加一条除主键之外其他字段值为Null的记录。
Insert()方法内部实际上通过构造insert SQL语句完成数据的添加,Insert()方法的第二个参数用于指定空值字段的名称,相信大家对该参数会感到疑惑,该参数的作用是什么?是这样的:如果第三个参数values 为Null或者元素个数为0,由于Insert()方法要求必须添加一条除了主键之外其它字段为Null值的记录,为了满足SQL语法的需要, insert语句必须给定一个字段名,如:insert into person(name) values(NULL),倘若不给定字段名, insert 语句就成了这样: insert into person() values(),显然这不满足标准SQL 的语法。
对于字段名,建议使用主键之外的字段,如果使用了INTEGER类型的主键字段,执行类似insert into person(personid) values(NULL)的insert语句后,该主键字段值也不会为NULL。
如果第三个参数values 不为Null并且元素的个数大于0 ,可以把第二个参数设置为null。
线性布局的一些属性:<LinearLayoutandroid:background="@android:drawable/list_selector_background android:clickable="true"android:focusable="true" //设置为可以获得焦点;>/*如果设置duplicateParentState属性,将直接从父容器中获取绘图状态(光标,按下等)。
注意仅仅是获取绘图状态,而没有获取事件,也就是你点一下LinearLayout时Button 有被点击的效果,但是不执行点击事件“*/<ImageViewstyle="@style/alarm_list_left_column"android:duplicateParentState="true"android:gravity="center"android:scaleType="center"android:src="@drawable/add_alarm" /><TextViewandroid:layout_gravity="center_vertical"android:duplicateParentState="true"android:text="@string/add_alarm"android:textAppearance="?android:attr/textAppearanceLarge" android:textColor="?android:attr/textColorPrimary" /></LinearLayout>水平分割线:调用系统的水平分割线;<ImageViewandroid:layout_width="match_parent"android:layout_height="wrap_content"android:gravity="fill_horizontal"android:scaleType="fitXY"android:src="@android:drawable/divider_horizontal_dark" /><ListViewandroid:id="@+id/alarms_list"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_weight="1"/> // ListView将占据中间剩余的部分;ImageButton的显示效果:<ImageButtonandroid:id="@+id/desk_clock_button"style="@style/ButtonStripLeft"android:layout_width="wrap_content"android:layout_height="wrap_content"android:contentDescription="@string/desk_clock_button_descript ion"android:src="@drawable/ic_clock_strip_desk_clock" />以上都是带图标的按钮;只需要设置src属性就行了;Android自带的文本判空工具;TextUtils.isEmpty(Str);android 监听系统时区变化,日期变化,时间变化1.监听时区变化:XML配置;<action android:name="android.intent.action.TIMEZONE_CHANGED"/> 代码控制:Intent.ACTION_TIMEZONE_CHANGED;2.监听日期变化<action android:name="android.intent.action. DATE_CHANGED "/>代码控制:Intent. ACTION_DATE_CHANGED;3.监听时间变化配置:<action android:name="android.intent.action.TIME_SET" />代码控制:Intent.ACTION_TIME_CHANGED;连续发送广播:The current time has changed. Sent every* minute.不能在manifest文件中注册这个action, 只能在代码中用Context#registerReceiver(BroadcastReceiver, IntentFilter)方式注册;ACTION_TIME_TICK = "android.intent.action.TIME_TICK";避免在BroadcastReceiver中做耗时的工作,防止阻塞BroadcastReceiver:private final BroadcastReceiver mIntentReceiver = new BroadcastReceiver(){@Overridepublic void onReceive(Context context, Intent intent){/** This is a protected intent that can only be sent* by the system.* 接收时区变化的广播;*/if (mLive&& intent.getAction().equals(Intent.ACTION_TIMEZONE_CHANGED)) {mCalendar = Calendar.getInstance();}// Post a runnable to avoid blocking the broadcast.// 用一个线程执行,避免阻塞广播接收者;mHandler.post(new Runnable(){public void run(){updateTime(); // 更新时间;}});}};Android---AlarmManager(全局定时器/闹钟)指定时长或以周期形式执行某项操作AlarmManager称为全局定时器,其实它的作用和Timer有点相似。