这个应用实现了简单的闹钟功能,关闭程序的状态中也可以进行闹钟的提醒.
遗留了一个问题:
如果我通过应用本身关闭程序,是可以实现我上述所说的功能,但是如果我在手机进程管理中实现应用程序的关闭操作,这个提醒就不起作用了,我很疑惑的是,我通过应用程序本身关闭了后,在进程中也是查看不到这个应用了的.所以哪位知道的帮留个言指点下,谢谢!!!!
ClockDemo.java:
package com.example.clock; import java.util.Calendar; import android.app.Activity; import android.app.AlertDialog; import android.app.TimePickerDialog; import android.content.DialogInterface; import android.os.Bundle; import android.view.KeyEvent; import android.view.View; import android.widget.Button; import android.widget.TimePicker; public class ClockDemo extends Activity { private Button mSet; Calendar mCalendar = Calendar.getInstance(); /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); ObjectPool.mAlarmHelper = new AlarmHelper(this); mSet = (Button) findViewById(R.id.mSet); setListener(); } public void setListener() { mSet.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { mCalendar.setTimeInMillis(System.currentTimeMillis()); int mHour = mCalendar.get(Calendar.HOUR_OF_DAY); int mMinute = mCalendar.get(Calendar.MINUTE); new TimePickerDialog(ClockDemo.this, new TimePickerDialog.OnTimeSetListener() { public void onTimeSet(TimePicker view, int hourOfDay, int minute) { mCalendar.setTimeInMillis(System .currentTimeMillis()); mCalendar.set(Calendar.HOUR_OF_DAY, hourOfDay); mCalendar.set(Calendar.MINUTE, minute); mCalendar.set(Calendar.SECOND, 0); mCalendar.set(Calendar.MILLISECOND, 0); ObjectPool.mAlarmHelper.openAlarm(32, "ddd", "ffff", mCalendar.getTimeInMillis()); } }, mHour, mMinute, true).show(); } }); } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK) { showBackDialog(); return true; } return super.onKeyDown(keyCode, event); } /** Give the tip when exit the application. */ public void showBackDialog() { final AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle("提示") .setIcon(R.drawable.icon) .setMessage("是否退出?") .setPositiveButton("sure", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { System.exit(0); android.os.Process .killProcess(android.os.Process .myPid()); dialog.dismiss(); } }) .setNegativeButton("cancel", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); } }); AlertDialog ad = builder.create(); ad.show(); } }
AlarmHelper.java:
package com.example.clock; import android.app.AlarmManager; import android.app.PendingIntent; import android.content.Context; import android.content.Intent; public class AlarmHelper { private Context c; private AlarmManager mAlarmManager; public AlarmHelper(Context c) { this.c = c; mAlarmManager = (AlarmManager) c .getSystemService(Context.ALARM_SERVICE); } public void openAlarm(int id, String title, String content, long time) { Intent intent = new Intent(); intent.putExtra("_id", id); intent.putExtra("title", title); intent.putExtra("content", content); intent.setClass(c, CallAlarm.class); PendingIntent pi = PendingIntent.getBroadcast(c, id, intent, PendingIntent.FLAG_UPDATE_CURRENT); mAlarmManager.set(AlarmManager.RTC_WAKEUP, time, pi); } public void closeAlarm(int id, String title, String content) { Intent intent = new Intent(); intent.putExtra("_id", id); intent.putExtra("title", title); intent.putExtra("content", content); intent.setClass(c, CallAlarm.class); PendingIntent pi = PendingIntent.getBroadcast(c, id, intent, 0); mAlarmManager.cancel(pi); } }
CallAlarm.java:
package com.example.clock; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; public class CallAlarm extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { intent.setClass(context, AlarmAlert.class); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(intent); } }
AlarmAlert.java:
package com.example.clock; import android.app.Activity; import android.app.AlertDialog; import android.content.DialogInterface; import android.os.Bundle; public class AlarmAlert extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); new AlertDialog.Builder(AlarmAlert.this) .setIcon(R.drawable.clock) .setTitle("ddd") .setMessage("fff") .setPositiveButton("ddd", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { System.exit(0); android.os.Process .killProcess(android.os.Process .myPid()); } }).show(); } }
ObjectPool.java:
public class ObjectPool { /** The alarm object. */ public static AlarmHelper mAlarmHelper; }
main.xml:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <DigitalClock android:id="@+id/dClock" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="40sp" android:textColor="@drawable/blue" /> <Button android:id="@+id/mSet" android:layout_width="100dp" android:layout_height="wrap_content" android:text="@string/str_button1" android:textColor="@drawable/red" android:textSize="18sp" /> </LinearLayout>
最后贴个配置文件:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.clock" android:versionCode="1" android:versionName="1.0"> <uses-sdk android:minSdkVersion="7" /> <application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name=".ClockDemo" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <receiver android:name=".CallAlarm" /> <activity android:name=".AlarmAlert" android:label="@string/app_name" /> </application> </manifest>
看了那么多,估计某些人又嫌烦了,我只贴上代码的目的是希望大家能看代码,而不是电脑上下了一个又一个的源文件,只知道用而不关心其中的技术点,这样就不能举一番三了,O(∩_∩)O哈哈~
为了不同的同学,我还是贴上源文件吧在.....
1.线性布局
线性布局由LinearLayout类来代表,它们将容器里的组件一个挨着一个地排列起来。不仅可以控制个组件横向排列,也可控制各组件纵向排列。
LinearLayout的常用XML属性及相关方法的说明
XML属性 相关方法 说明 android:gravity setGravity(int)
设置布局管理器内组件的对齐方式。该属性支持top,bottom,left,right,center_certical,
center_horizontal,fill_horizontal,center,
fill,clip_vertical,clip_horizontal。也可以同时制定多种堆砌方式的组合,例如left|center_horizontal 代表出现在屏幕左边,而且垂直居中。竖线前后千万不能出现空格
android:orientation setOrientation(int)设置布局管理器内组件的排列方式,可以设置为
horizontal(水平排列)、vertical(垂直排列、默认值)两个值的其中之一
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" android:gravity="right|center_horizontal"> <Button android:layout_height="wrap_content" android:text="@string/btl1" android:id="@+id/btl1" android:layout_width="94dp"> </Button> <Button android:layout_height="wrap_content" android:text="@string/btl2" android:id="@+id/btl2" android:layout_width="94dp"> </Button> <Button android:layout_height="wrap_content" android:text="@string/btl3" android:id="@+id/btl3" android:layout_width="94dp"> </Button> <Button android:layout_height="wrap_content" android:text="@string/btl4" android:id="@+id/btl4" android:layout_width="94dp"> </Button> <Button android:layout_height="wrap_content" android:text="@string/btl5" android:id="@+id/btl5" android:layout_width="94dp"> </Button> <Button android:layout_height="wrap_content" android:text="@string/btl6" android:id="@+id/btl6" android:layout_width="94dp"> </Button> </LinearLayout>
2.表格布局
表格布局由TableLayout所代表,表格布局采用行,列的形式来管理UI组件,TableLayout并不需要明确地声明包含多少行,列,而是通过添加TableRow,其他组件来控制表格的行数和列数。
每次想TableLayout中添加一个TableRow,该TableRow就是一个表格行,TableRow也是容器,因此它可以不断地添加其他组件,每添加一个子组件该表格就增加一列。
TableLayout的常用XML属性及相关方法的说明
XML属性 相关方法 说明 android:collapseColumns setColumnCollapsed(int,boolean) 设置需要被隐藏的列的列序号,多个列序号之间用逗号隔开 android:shrinkColumns setShrinkAkllColumns(boolean) 设置允许被收缩的列的列序号,多个列序号之间用逗号隔开 android:stretchColumns setStretchAllColumns(boolean) 设置允许被拉伸的列的列序号,多个列序号之间用逗号隔开
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <!-- 第一个表格布局,指定第2列允许收缩,第3列允许拉伸 --> <TableLayout android:id="@+id/tl1" android:layout_width="fill_parent" android:layout_height="wrap_content" android:shrinkColumns="1" android:stretchColumns="2" > <!-- 独占一行 --> <Button android:layout_height="wrap_content" android:layout_width="wrap_content" android:text="独自一行的按钮" android:id="@+id/btt1"> </Button> <TableRow > <Button android:layout_height="wrap_content" android:layout_width="wrap_content" android:text="普通按钮" android:id="@+id/btt2" > </Button> <Button android:layout_height="wrap_content" android:layout_width="wrap_content" android:text="允许收缩按钮" android:id="@+id/btt3"> </Button> <Button android:layout_height="wrap_content" android:layout_width="wrap_content" android:text="可以被允许拉伸按钮" android:id="@+id/btt4"> </Button> </TableRow> </TableLayout> <!-- 第二个表格布局,指定第2列隐藏 --> <TableLayout android:id="@+id/tl2" android:layout_width="fill_parent" android:layout_height="wrap_content" android:collapseColumns="1" > <!-- 独占一行 --> <Button android:layout_height="wrap_content" android:layout_width="wrap_content" android:text="独自一行的按钮" android:id="@+id/btt5"> </Button> <TableRow > <Button android:layout_height="wrap_content" android:layout_width="wrap_content" android:text="普通按钮1" android:id="@+id/btt6" > </Button> <Button android:layout_height="wrap_content" android:layout_width="wrap_content" android:text="普通按钮3" android:id="@+id/btt7"> </Button> <Button android:layout_height="wrap_content" android:layout_width="wrap_content" android:text="普通按钮3" android:id="@+id/btt8"> </Button> </TableRow> </TableLayout> <!-- 第三个表格布局,指定第2列和第3列允许拉伸 --> <TableLayout android:id="@+id/tl3" android:layout_width="fill_parent" android:layout_height="wrap_content" android:stretchColumns="1,2" > <!-- 独占一行 --> <Button android:layout_height="wrap_content" android:layout_width="wrap_content" android:text="独自一行的按钮" android:id="@+id/btt9"> </Button> <TableRow > <Button android:layout_height="wrap_content" android:layout_width="wrap_content" android:text="普通按钮1" android:id="@+id/btt10" > </Button> <Button android:layout_height="wrap_content" android:layout_width="wrap_content" android:text="允许拉伸按钮" android:id="@+id/btt11"> </Button> <Button android:layout_height="wrap_content" android:layout_width="wrap_content" android:text="普通按钮3" android:id="@+id/btt12"> </Button> </TableRow> <TableRow > <Button android:layout_height="wrap_content" android:layout_width="wrap_content" android:text="允许拉伸按钮" android:id="@+id/btt13" > </Button> <Button android:layout_height="wrap_content" android:layout_width="wrap_content" android:text="允许拉伸按钮" android:id="@+id/btt14"> </Button> </TableRow> </TableLayout> </LinearLayout>效果图:
3.帧布局
帧布局由FrameLayout所代表,帧布局容器为每个加入其中的组件创建一个空白的区域(成为一帧),所有每个子组件占据一帧,这些帧都会根据gravity属性执行自动对齐。也就是说,把组件一个一个的叠加在一起。
FrameLayout的常用XML属性及相关方法的说明 XML属性 相关方法 说明 android:foreground setForeground(Drawable)
设置该帧布局容器的前景图像
android:foregroundGravity setForegroundGravity(int)定义绘制前景图像的gravity属性
渐进效果
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <!-- 一次定义7个Textview,先定义的TextView位于底层,后定义的TextView位于上层 --> <TextView android:id="@+id/view01" android:layout_width="wrap_content" android:layout_height="wrap_content" android:width="210px" android:height="50px" android:background="#ff0000"/> <TextView android:id="@+id/view02" android:layout_width="wrap_content" android:layout_height="wrap_content" android:width="180px" android:height="50px" android:background="#dd0000"/> <TextView android:id="@+id/view03" android:layout_width="wrap_content" android:layout_height="wrap_content" android:width="150px" android:height="50px" android:background="#bb0000"/> <TextView android:id="@+id/view04" android:layout_width="wrap_content" android:layout_height="wrap_content" android:width="120px" android:height="50px" android:background="#990000"/> <TextView android:id="@+id/view05" android:layout_width="wrap_content" android:layout_height="wrap_content" android:width="90px" android:height="50px" android:background="#770000"/> <TextView android:id="@+id/view06" android:layout_width="wrap_content" android:layout_height="wrap_content" android:width="60px" android:height="50px" android:background="#550000"/> <TextView android:id="@+id/view07" android:layout_width="wrap_content" android:layout_height="wrap_content" android:width="30px" android:height="50px" android:background="#330000"/> </FrameLayout>
效果图:
本人开了个充值淘宝网店。有需要的朋友请访问的店铺并拍下所充值的话费,
本店已加入消费保障服务计划,货源来源于淘宝充值平台,安全可靠便捷,
支付过后立即到账
http://xiaowen168.taobao.com
今天看了下<merge />标签的使用,总结如下:
1.merge标签中的子集是直接加到Activity的FrameLayout根节点下,(Activity视图的根节点都是frameLayout).如果你所创建的Layout并不是用framLayout作为根节点(而是应用LinerLayout等定义root标签),就不能通过merge来优化UI结构.
2.当应用Include或者ViewStub标签从外部导入xml结构时,可以将被导入的xml用merge作为根节点表示,这样当被嵌入父级结构中后可以很好的将它所包含的子集融合到父级结构中,而不会出现冗余的节点.
<?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent"> <ImageView android:layout_width="fill_parent" android:layout_height="fill_parent" android:scaleType="center" android:background="@drawable/bg" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginBottom="20dip" android:layout_gravity="center_horizontal|bottom" android:padding="12dip" android:background="#AA000000" android:textColor="#ffffffff" android:text="Golden Gate" /> </FrameLayout>
大家可以将根节点FrameLayout更改成merge标签进行测试,显示效果是一样,但是我们通过sdk中的tools> hierarchyviewer.bat进行视图查看,我们可以看到区别.
另外需要注意的是:
1.<merge />只可以作为xml layout的根节点.
2.当需要扩充的xml layout本身是由merge作为根节点的话,需要将被导入的xml layout置于 viewGroup中,同时需要设置attachToRoot为True.