Activity 之间的手势切换
对于Android桌面可以用手势左右滑动进行切换。或者大家用过iReader的一定被其丰富的手势折服吧。现在看看自己的多个Activy之间如何切换呢
1、需要继承OnGestureListener和OnDoubleTapListener,如下:
1. public class ViewSnsActivity extends Activity implements OnTouchListener, OnGestureListener
public class ViewSnsActivity extends Activity implements OnTouchListener, OnGestureListener
2、在添加mGestureDetector的定义,并在 ViewSnsActivity的onCreate函数中加入其页面布局的setOnTouchListener事件
1. GestureDetector mGestureDetector;
GestureDetector mGestureDetector;
1. public void onCreate(Bundle savedInstanceState) {
2. super .onCreate(savedInstanceState);
3. setContentView(R.layout.view_sns_activity);
4.
5. mGestureDetector = new GestureDetector((OnGestureListener) this );
6. LinearLayout viewSnsLayout = (LinearLayout)findViewById(R.id.viewSnsLayout);
7. viewSnsLayout.setOnTouchListener(this );
8. viewSnsLayout.setLongClickable(true );
9. }
public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.view_sns_activity); mGestureDetector = new GestureDetector((OnGestureListener) this); LinearLayout viewSnsLayout = (LinearLayout)findViewById(R.id.viewSnsLayout); viewSnsLayout.setOnTouchListener(this); viewSnsLayout.setLongClickable(true); }
3、重载onFling函数
1. public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
2. float velocityY) {
3.
4. if (e1.getX()-e2.getX() > snsConstant.getFlingMinDistance()
5. && Math.abs(velocityX) > snsConstant.getFlingMinVelocity()) {
6.
7. // 切换Activity
8. // Intent intent = new Intent(ViewSnsActivity.this, UpdateStatusActivity.class);
9. // startActivity(intent);
10. Toast.makeText(this , "向左手势" , Toast.LENGTH_SHORT).show();
11. } else if (e2.getX()-e1.getX() > snsConstant.getFlingMinDistance()
12. && Math.abs(velocityX) > snsConstant.getFlingMinVelocity()) {
13.
14. // 切换Activity
15. // Intent intent = new Intent(ViewSnsActivity.this, UpdateStatusActivity.class);
16. // startActivity(intent);
17. Toast.makeText(this , "向右手势" , Toast.LENGTH_SHORT).show();
18. }
19.
20. return false ;
21. }
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { if (e1.getX()-e2.getX() > snsConstant.getFlingMinDistance() && Math.abs(velocityX) > snsConstant.getFlingMinVelocity()) { // 切换Activity // Intent intent = new Intent(ViewSnsActivity.this, UpdateStatusActivity.class); // startActivity(intent); Toast.makeText(this, "向左手势", Toast.LENGTH_SHORT).show(); } else if (e2.getX()-e1.getX() > snsConstant.getFlingMinDistance() && Math.abs(velocityX) > snsConstant.getFlingMinVelocity()) { // 切换Activity // Intent intent = new Intent(ViewSnsActivity.this, UpdateStatusActivity.class); // startActivity(intent); Toast.makeText(this, "向右手势", Toast.LENGTH_SHORT).show(); } return false; }
其中SnsConstant如下:
1. public class SnsConstant {
2. private static final int FLING_MIN_DISTANCE = 50 ;
3. private static final int FLING_MIN_VELOCITY = 0 ;
4.
5. public static int getFlingMinDistance() {
6. return FLING_MIN_DISTANCE;
7. }
8. public static int getFlingMinVelocity() {
9. return FLING_MIN_VELOCITY;
10. }
11. }
public class SnsConstant { private static final int FLING_MIN_DISTANCE = 50; private static final int FLING_MIN_VELOCITY = 0; public static int getFlingMinDistance() { return FLING_MIN_DISTANCE; } public static int getFlingMinVelocity() { return FLING_MIN_VELOCITY; } }
4、重载onTouch函数
1. public boolean onTouch(View v, MotionEvent event) {
2. return mGestureDetector.onTouchEvent(event);
3. }
获取android中正在运行应用程序的列表
public boolean onTouch(View v, MotionEvent event) { return mGestureDetector.onTouchEvent(event); }
废话不多说!看代码。
ActivityMain.java
view plaincopy to clipboardprint?
1. public class ActivityMain extends ListActivity {
2. @Override
3. public void onCreate(Bundle savedInstanceState) {
4. super.onCreate(savedInstanceState);
5. requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
6.
7. List<Programe> list = getRunningProcess();
8. ListAdapter adapter = new ListAdapter(list,this);
9. getListView().setAdapter(adapter);
10. }
11.
12. //正在运行的
13. public List<Programe> getRunningProcess(){
14. PackagesInfo pi = new PackagesInfo(this);
15.
16. ActivityManager am = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
17. //获取正在运行的应用
18. List<RunningAppProcessInfo> run = am.getRunningAppProcesses();
19. //获取包管理器,在这里主要通过包名获取程序的图标和程序名
20. PackageManager pm =this.getPackageManager();
21. List<Programe> list = new ArrayList<Programe>();
22.
23. for(RunningAppProcessInfo ra : run){
24. //这里主要是过滤系统的应用和电话应用,当然你也可以把它注释掉。
25. if(ra.processName.equals("system") || ra.processName.equals("com.android.phone")){
26. continue;
27. }
28.
29. Programe pr = new Programe();
30. pr.setIcon(pi.getInfo(ra.processName).loadIcon(pm));
31. pr.setName(pi.getInfo(ra.processName).loadLabel(pm).toString());
32. System.out.println(pi.getInfo(ra.processName).loadLabel(pm).toString());
33. list.add(pr);
34. }
35. return list;
36. }
37.
38. }
ListAdapter.java
view plaincopy to clipboardprint?
1. public class ListAdapter extends BaseAdapter {
2. List<Programe> list = new ArrayList<Programe>();
3. LayoutInflater la;
4. Context context;
5.
6. public ListAdapter(List<Programe> list ,Context context){
7. this.list = list;
8. this.context = context;
9. }
10.
11. @Override
12. public int getCount() {
13. // TODO Auto-generated method stub
14. return list.size();
15. }
16. @Override
17. public Object getItem(int position) {
18. // TODO Auto-generated method stub
19. return list.get(position);
20. }
21. @Override
22. public long getItemId(int position) {
23. // TODO Auto-generated method stub
24. return position;
25. }
26. @Override
27. public View getView(int position, View convertView, ViewGroup parent) {
28. ViewHolder holder;
29. if(convertView == null)
30. {
31. la = LayoutInflater.from(context);
32. convertView=la.inflate(R.layout.list_item, null);
33.
34. holder = new ViewHolder();
35. holder.imgage=(ImageView) convertView.findViewById(R.id.image);
36. holder.text = (TextView) convertView.findViewById(R.id.text);
37.
38. convertView.setTag(holder);
39. }else{
40. holder = (ViewHolder) convertView.getTag();
41. }
42. final Programe pr = (Programe)list.get(position);
43. //设置图标
44. holder.imgage.setImageDrawable(pr.getIcon());
45. //设置程序名
46. holder.text.setText(pr.getName());
47.
48. return convertView;
49. }
50. }
51. class ViewHolder{
52. TextView text;
53. ImageView imgage;
54. }
PackagesInfo.java
view plaincopy to clipboardprint?
1. public class PackagesInfo {
2. private List<ApplicationInfo> appList;
3.
4. public PackagesInfo(Context context){
5. //通包管理器,检索所有的应用程序(甚至卸载的)与数据目录
6. PackageManager pm = context.getApplicationContext().getPackageManager();
7. appList = pm.getInstalledApplications(PackageManager.GET_UNINSTALLED_PACKAGES);
8. }
9.
10.
11.
12. /**
13. * 通过一个程序名返回该程序的一个Application对象。
14. * @param name 程序名
15. * @return ApplicationInfo
16. */
17.
18. public ApplicationInfo getInfo(String name){
19. if(name == null){
20. return null;
21. }
22. for(ApplicationInfo appinfo : appList){
23. if(name.equals(appinfo.processName)){
24. return appinfo;
25. }
26. }
27. return null;
28. }
29.
30. }
Programe.java
view plaincopy to clipboardprint?
1. public class Programe {
2. //图标
3. private Drawable icon;
4. //程序名
5. private String name;
6.
7. public Drawable getIcon() {
8. return icon;
9. }
10. public void setIcon(Drawable icon) {
11. this.icon = icon;
12. }
13. public String getName() {
14. return name;
15. }
16. public void setName(String name) {
17. this.name = name;
18. }
19.
20. }
list_item.xml
view plaincopy to clipboardprint?
1. <?xml version="1.0" encoding="UTF-8"?>
2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
3. android:orientation="horizontal"
4. android:layout_width="wrap_content"
5. android:layout_height="wrap_content"
6. >
7. <ImageView
8. android:id="@+id/image"
9. android:layout_width="wrap_content"
10. android:layout_height="wrap_content"
11. android:layout_marginRight="10dip"
12. />
13. <TextView
14. android:id="@+id/text"
15. android:layout_width="wrap_content"
16. android:layout_height="wrap_content"
17. />
18.
19. </LinearLayout>
效果如图:
SQLite 小例子。
这是我在网站看到过一个网友做的SQLite一个小程序,觉得写的不错,以供提示参考,所以把转载下来了。其实就是一个小收藏夹。
代码如下:
ActivityMain_1.java
view plaincopy to clipboardprint?
1. public class ActivityMain_1 extends Activity {
2. //声明EditText实例
3. private EditText et1,et2,et3;
4. //声明Button实例
5. private Button button;
6.
7. @Override
8. protected void onCreate(Bundle savedInstanceState) {
9. // TODO Auto-generated method stub
10. super.onCreate(savedInstanceState);
11. setContentView(R.layout.main_1);
12.
13. //根据ID获得实例对象
14. et1 = (EditText) findViewById(R.id.EditText01);
15. et2 = (EditText) findViewById(R.id.EditText02);
16. et3 = (EditText) findViewById(R.id.EditText03);
17. button = (Button) findViewById(R.id.button);
18.
19. //事件
20. button.setOnClickListener(new View.OnClickListener() {
21.
22. @Override
23. public void onClick(View v) {
24. String name=et1.getText().toString();
25. String url =et2.getText().toString();
26. String desc = et3.getText().toString();
27.
28. ContentValues values = new ContentValues();
29.
30. values.put("name", name);
31. values.put("url", url);
32. values.put("desc", desc);
33.
34. //实例化数据库帮助类
35. DBHelper helper = new DBHelper(getApplicationContext());
36. //打开数据库
37. helper.open();
38.
39. //插入数据
40. helper.insert(values);
41. //实例化Intent
42. Intent intent = new Intent(ActivityMain_1.this,QueryActivity.class);
43. startActivity(intent);
44. helper.close();
45. }
46. });
47.
48. }
49.
50.
51. }
QueryActivity.java
view plaincopy to clipboardprint?
1. public class QueryActivity extends ListActivity {
2.
3. private ListView listView;
4. private Cursor c;
5.
6. @Override
7. protected void onCreate(Bundle savedInstanceState) {
8. // TODO Auto-generated method stub
9. super.onCreate(savedInstanceState);
10. //setContentView(R.layout.row);
11.
12. //实例化数据库帮助类
13. final DBHelper help = new DBHelper(this);
14. help.open();
15. c= help.query();
16. query();
17. //提示对话框
18. final AlertDialog.Builder builder = new AlertDialog.Builder(this);
19. listView.setOnItemClickListener(new OnItemClickListener() {
20. @Override
21. public void onItemClick(AdapterView<?> parent, View view,
22. int position, long id) {
23. final long temp = id;
24. builder.setMessage("真的要删除该条记录吗?").setPositiveButton("是", new DialogInterface.OnClickListener() {
25.
26. @Override
27. public void onClick(DialogInterface dialog, int which) {
28. System.out.println("yes");
29. help.del((int)temp);
30. //重新查询
31. //query();
32. Cursor c = help.query();
33. //列表项数组
34. String[] from ={"_id","name","url","desc"};
35. //列表项ID
36. int[] to ={R.id.text0,R.id.text1,R.id.text2,R.id.text3};
37. //适配器
38. SimpleCursorAdapter adapter = new SimpleCursorAdapter(getApplicationContext(),R.layout.row,c,from,to);
39. ListView listView = getListView();
40. listView.setAdapter(adapter);
41.
42.
43. }
44. }).setNegativeButton("否", new DialogInterface.OnClickListener() {
45.
46. @Override
47. public void onClick(DialogInterface dialog, int which) {
48. // TODO Auto-generated method stub
49.
50. }
51. });
52. builder.create();
53. builder.show();
54. }
55. });
56.
57. }
58. @Override
59. protected void onStop() {
60. // TODO Auto-generated method stub
61. super.onStop();
62.
63. }
64. public void query(){
65. //列表项数组
66. String[] from ={"_id","name","url","desc"};
67. //列表项ID
68. int[] to ={R.id.text0,R.id.text1,R.id.text2,R.id.text3};
69.
70. //适配器
71. SimpleCursorAdapter adapter = new SimpleCursorAdapter(this,R.layout.row,c,from,to);
72. //adapter.notifyDataSetChanged();
73. //列表视图
74. listView = getListView();
75. //为列表视图添加适配器
76. listView.setAdapter(adapter);
77.
78. }
79.
80.
81. }
DBHelper.java
view plaincopy to clipboardprint?
1. public class DBHelper extends SQLiteOpenHelper {
2.
3. private static final String DB_NAME="coll.db";
4. //表名
5. private static final String TBL_NAME="logtable";
6. //创建SQL语句
7. private static final String CREATE_TBL = "create table logtable " +
8. "(_id integer primary key autoincrement,name text,url text,desc text)";
9. //SQLiteDatabase实例
10. private SQLiteDatabase db;
11.
12. public DBHelper(Context context) {
13. super(context, DB_NAME, null, 2);
14.
15. }
16. @Override
17. public void onCreate(SQLiteDatabase db) {
18.
19. db.execSQL(CREATE_TBL);
20. }
21.
22. //打开数据库
23. public void open(){
24. db = getWritableDatabase();
25. }
26.
27. @Override
28. public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
29. // TODO Auto-generated method stub
30. }
31.
32. //插入方法
33. public void insert(ContentValues values){
34.
35. db.insert(TBL_NAME, null, values);
36. }
37.
38. //查询方法
39. public Cursor query(){
40. Cursor c = db.query(TBL_NAME, null, null, null, null, null, null);
41. return c;
42. }
43.
44. //删除方法
45. public void del(int id){
46. db.delete(TBL_NAME, "_id=?", new String[]{String.valueOf(id)});
47. }
48.
49. //关闭数据库
50. public void close(){
51. if (db != null){
52. db.close();
53. }
54. }
55. }
main_1.xml
view plaincopy to clipboardprint?
1. <?xml version="1.0" encoding="UTF-8"?>
2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
3. android:orientation="vertical"
4. android:layout_width="fill_parent"
5. android:layout_height="fill_parent"
6. >
7.
8. <TextView
9. android:id="@+id/TextView01"
10. android:layout_width="fill_parent"
11. android:layout_height="wrap_content"
12. android:text="网站名称"
13. />
14. <EditText
15. android:id="@+id/EditText01"
16. android:layout_width="fill_parent"
17. android:layout_height="wrap_content"
18.
19. />
20. <TextView
21. android:id="@+id/TextView02"
22. android:layout_width="fill_parent"
23. android:layout_height="wrap_content"
24. android:text="URL"
25. />
26. <EditText
27. android:id="@+id/EditText02"
28. android:layout_width="fill_parent"
29. android:layout_height="wrap_content"
30. />
31. <TextView
32. android:id="@+id/TextView03"
33. android:layout_width="fill_parent"
34. android:layout_height="wrap_content"
35. android:text="网站描述"
36. />
37. <EditText
38. android:id="@+id/EditText03"
39. android:layout_width="fill_parent"
40. android:layout_height="wrap_content"
41. android:height="100px"
42. />
43.
44. <Button
45. android:id="@+id/button"
46. android:layout_width="wrap_content"
47. android:layout_height="wrap_content"
48. android:text="添加"
49. />
50. </LinearLayout>
自定义布局:row.xml
view plaincopy to clipboardprint?
1. <?xml version="1.0" encoding="UTF-8"?>
2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
3. android:orientation="horizontal"
4. android:layout_width="fill_parent"
5. android:layout_height="fill_parent"
6. android:layout_gravity="center_vertical"
7. >
8.
9. <TextView
10. android:id="@+id/text0"
11. android:layout_width="wrap_content"
12. android:layout_height="wrap_content"
13. android:paddingRight="10px"
14. />
15. <TextView
16. android:id="@+id/text1"
17. android:layout_width="wrap_content"
18. android:layout_height="wrap_content"
19. android:paddingRight="10px"
20. />
21. <TextView
22. android:id="@+id/text2"
23. android:layout_width="wrap_content"
24. android:layout_height="wrap_content"
25. android:paddingRight="10px"
26. />
27. <TextView
28. android:id="@+id/text3"
29. android:layout_width="wrap_content"
30. android:layout_height="wrap_content"
31. android:paddingRight="10px"
32. />
33.
34. </LinearLayout>
结果如图所示:
roadcast Receive广播
一.Broadcast Receive为广播接收器,它和事件处理机制类似,只不过事件的处理机制是程序组件级别的,而广播处理机制是系统级别的。
Broadcast Receiver用于接收并处理广播通知(broadcast announcements)。多数的广播是系统发起的,如地域变换、电量不足、来电来信等。程序也可以播放一个广播。程序可以有任意数量的 broadcast receivers来响应它觉得重要的通知。broadcast receiver可以通过多种方式通知用户:启动activity、使用NotificationManager、开启背景灯、振动设备、播放声音等,最典型的是在状态栏显示一个图标,这样用户就可以点它打开看通知内容。
通常我们的某个应用或系统本身在某些事件(电池电量不足、来电来短信)来临时会广播一个Intent出去,我们可以利用注册一个Broadcast Receiver来监听到这些Intent并获取Intent中的数据。
二.事件的广播比价简单,构建Intent对象,调用sendBroadcast()方法将广播发出。事件的接收是通过定义一个继承BroadcastReceiver类来实现,继承该类后覆盖其onReceiver方法,并在该方法中相应事件。
MainActivity:
Intent intent=new Intent();
intent.setAction(MY_ACTION);
intent.putExtra("msg","请回复");
sendBroadcast(intent);
MyReceiver:
public calss MyReceiver extends BroadcastReceiver{
public void onReceiver(Context ctx,intent intent){
//从Intent中获得信息
String msg=intent.getString("msg");
Toast.makeText(ctx,msg,Toast.LENGTH_LONG).show()
}
}
三.系统广播事件的使用
1. 这些广播是系统自动发出,我们直接定义事件接收器进行接收。
通过配置文件注册
MyReceiver2:
public class MyReceiver2 extends BroadcastReceiver{
public void onReceiver( Context context,Intent intent){
Log.i("my_tag","BOOT_COMPLETED")
}
}
AndroidMainifest.xml:
<receiver android:name="MyReceiver2">
<intent-filter>
<android android:name="android.intent.android.BOOT_COMPLETED">
</intent-filter>
</receiver>
通过代码注册:
IntentFilter filter=new IntentFilter();//实例化
//实例化Receiver
MyReceiver2=new MyReceiver2();
//注册Receiver
registerReceiver(r,filter);
//注销Receiver
unregisterReceiver(r);
四.Notification和NotificationManager的使用
Broadcast Receiver组件并没有提供可视化的界面来显示广播信息。这里我们可以使用Notification和Notification Manager来实现可视化的信息的界面,通过使用它们 ,我们可以显示广播信息的内容,图标及震动信息。
五.AlarmManager的使用
现在的手机普遍都会有一个闹钟功能,如果使用Android来实现一个闹钟,可以使用AlarmManager来实现。AndroidManager提供了一种系统级的提示服务,允许你安排在将来的某个时间执行一个任务,AlarmManager对象一般不直接实例化,而是通过Context.getSystemService(Context.ALARM_SERVICE)方法获得。
实例一、自定义broadcast receive来处理广播事件
/Chapter08_Broadcast_Receiver1/src/com/amaker/ch08/app/MainActivity.java
代码
package com.amaker.ch08.app;
import com.amaker.ch08.app.R;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class MainActivity extends Activity {
// 定义一个Action常量
private static final String MY_ACTION = "com.amaker.ch08.action.MY_ACTION";
// 定义一个Button对象
private Button btn;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 设置当前布局视图
setContentView(R.layout.main);
btn = (Button)findViewById(R.id.Button01);
// 为按钮设置单击监听器
btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// 实例化Intent对象
Intent intent = new Intent();
// 设置Intent action属性
intent.setAction(MY_ACTION);
// 为Intent添加附加信息
intent.putExtra("msg", "地瓜地瓜,我是土豆,收到请回复,收到请回复!");
// 发出广播
sendBroadcast(intent);
}
});
}
}
自定义广播事件的使用
/Chapter08_Broadcast_Receiver1/src/com/amaker/ch08/app/MyReceiver.java
代码
package com.amaker.ch08.app;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;
public class MyReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context cxt, Intent intent) {
// 从Intent中获得信息
String msg = intent.getStringExtra("msg");
// 使用Toast显示
Toast.makeText(cxt, msg, Toast.LENGTH_LONG).show();
}
}
/Chapter08_Broadcast_Receiver1/src/com/amaker/ch08/app/MyReceiver2.java
代码
package com.amaker.ch08.app;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
public class MyReceiver2 extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
// 显示广播信息
Log.i("my_tag", "BOOT_COMPLETED~~~~~~~~~~~~~~~~");
}
}
系统广播事件的使用
/Chapter08_Broadcast_Receiver1/res/layout/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"
>
<Button
android:text="发出广播..."
android:id="@+id/Button01"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
/Chapter08_Broadcast_Receiver1/AndroidManifest.xml
代码
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.amaker.ch08.app"
android:versionCode="1"
android:versionName="1.0">
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".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>
<receiver android:name="MyReceiver">
<intent-filter>
<action android:name="com.amaker.ch08.action.MY_ACTION"/>
</intent-filter>
</receiver>
<receiver android:name="MyReceiver2">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
</intent-filter>
</receiver>
</application>
<uses-sdk android:minSdkVersion="3" />
</manifest>
二、notification和notificationmanager的使用
1、获取系统级的服务notificationmanager
String service = NOTIFICATION_SERVICE;
NotificationManager nm = (NotificationManager)getSystemService(service);
2、实例化Notification
Notification n = new Notification();
// 设置显示图标,该图标会在状态栏显示
int icon = n.icon = R.drawable.icon;
// 设置显示提示信息,该信息也会在状态栏显示
String tickerText = "Test Notification";
// 显示时间
long when = System.currentTimeMillis();
n.icon = icon;
n.tickerText = tickerText;
n.when = when;
// 也可以通过这种构造方法来设置
Notification n1 = new Notification(icon, tickerText, when);
3、实例化Intent
Intent intent = new Intent(this, MainActivity_Temp.class);
// 获得PendingIntent
PendingIntent pi = PendingIntent.getActivity(this, 0, intent, 0);
// 设置事件信息
n.setLatestEventInfo(this, "My Title", "My Content", pi);
n.defaults |= Notification.DEFAULT_SOUND;
n.sound = Uri.parse("file:///sdcard/sound.mp3");
n.sound = Uri.withAppendedPath(Audio.Media.INTERNAL_CONTENT_URI, "6");
n.defaults |= Notification.DEFAULT_VIBRATE;
long[] vibrate = {0,50,100,150};
n.vibrate = vibrate;
n.defaults |= Notification.DEFAULT_LIGHTS;
n.ledARGB = 0xff00ff00;
n.ledOnMS = 300;
n.ledOffMS = 1000;
n.flags |= Notification.FLAG_SHOW_LIGHTS;
4、发通知
// 标示该通知的ID
int ID = 1;
// 发出通知
nm.notify(ID, n);
利用notification和notificationmanager来实现可视化的消息显示。
/Chapter08_Notification1/src/com/amaker/ch08/app/MainActivity.java
代码
package com.amaker.ch08.app;
import com.amaker.ch08.app.R;
import android.app.Activity;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class MainActivity extends Activity {
// 声明按钮
private Button sendBtn,cancelBtn;
// 声明Notification
private Notification n ;
// 声明NotificationManager
private NotificationManager nm;
// Notification标示ID
private static final int ID = 1;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// 实例化按钮
sendBtn = (Button)findViewById(R.id.sendButton01);
cancelBtn = (Button)findViewById(R.id.cancelButton02);
// 获得NotificationManager实例
String service = NOTIFICATION_SERVICE;
nm = (NotificationManager)getSystemService(service);
// 实例化Notification
n = new Notification();
// 设置显示图标,该图标会在状态栏显示
int icon = n.icon = R.drawable.happy;
// 设置显示提示信息,该信息也会在状态栏显示
String tickerText = "Test Notification";
// 显示时间
long when = System.currentTimeMillis();
n.icon = icon;
n.tickerText = tickerText;
n.when = when;
// 为按钮添加监听器
sendBtn.setOnClickListener(sendListener);
cancelBtn.setOnClickListener(cancelListener);
}
// 发送通知监听器
private OnClickListener sendListener = new OnClickListener() {
@Override
public void onClick(View v) {
// 实例化Intent
Intent intent = new Intent(MainActivity.this, MainActivity.class);
// 获得PendingIntent
PendingIntent pi = PendingIntent.getActivity(MainActivity.this, 0, intent, 0);
// 设置事件信息
n.setLatestEventInfo(MainActivity.this, "My Title", "My Content", pi);
// 发出通知
nm.notify(ID, n);
}
};
// 取消通知监听器
private OnClickListener cancelListener = new OnClickListener() {
@Override
public void onClick(View v) {
// 取消通知
nm.cancel(ID);
}
};
}
/Chapter08_Notification1/res/layout/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"
>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="测试Notification"
/>
<Button
android:text="发出通知"
android:id="@+id/sendButton01"
android:layout_width="wrap_content"
android:layout_height="wrap_content"></Button>
<Button
android:text="取消通知"
android:id="@+id/cancelButton02"
android:layout_width="wrap_content"
android:layout_height="wrap_content"></Button>
</LinearLayout>
/Chapter08_Notification1/AndroidManifest.xml
代码
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.amaker.ch08.app"
android:versionCode="1"
android:versionName="1.0">
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".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>
</application>
<uses-sdk android:minSdkVersion="3" />
</manifest>
二、notification、notificationmanager和broadcast receiver的综合实例
/Chapter08_Notification2/src/com/amaker/ch08/app/MainActivity.java
代码
package com.amaker.ch08.app;
import com.amaker.ch08.app.R;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class MainActivity extends Activity {
// 声明Button
private Button btn;
// 定义Broadcast Receiver action
private static final String MY_ACTION = "com.amaker.ch08.app.MY_ACTION";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 设置当前布局视图
setContentView(R.layout.main);
// 实例化Button
btn = (Button)findViewById(R.id.Button01);
// 添加事件监听器
btn.setOnClickListener(listener);
}
// 创建事件监听器
private OnClickListener listener = new OnClickListener() {
@Override
public void onClick(View v) {
// 实例化Intent
Intent intent = new Intent();
// 设置Intent action属性
intent.setAction(MY_ACTION);
// 发起广播
sendBroadcast(intent);
}
};
}
/Chapter08_Notification2/src/com/amaker/ch08/app/DisplayActivity.java
代码
package com.amaker.ch08.app;
import com.amaker.ch08.app.R;
import android.app.Activity;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class DisplayActivity extends Activity {
// 声明按钮
private Button cancelBtn;
// 声明Notification
private Notification n ;
// 声明NotificationManager
private NotificationManager nm;
// Notification标示ID
private static final int ID = 1;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main2);
// 实例化按钮
cancelBtn = (Button)findViewById(R.id.cancelButton02);
// 获得NotificationManager实例
String service = NOTIFICATION_SERVICE;
nm = (NotificationManager)getSystemService(service);
// 实例化Notification
n = new Notification();
// 设置显示图标,该图标会在状态栏显示
int icon = n.icon = R.drawable.happy;
// 设置显示提示信息,该信息也会在状态栏显示
String tickerText = "Test Notification";
// 显示时间
long when = System.currentTimeMillis();
n.icon = icon;
n.tickerText = tickerText;
n.when = when;
// 实例化Intent
Intent intent = new Intent(this, MainActivity.class);
// 获得PendingIntent
PendingIntent pi = PendingIntent.getActivity(this, 0, intent, 0);
// 设置事件信息
n.setLatestEventInfo(this, "My Title", "My Content", pi);
// 发出通知
nm.notify(ID, n);
// 为按钮添加监听器
cancelBtn.setOnClickListener(cancelListener);
}
// 取消通知监听器
private OnClickListener cancelListener = new OnClickListener() {
@Override
public void onClick(View v) {
// 取消通知
nm.cancel(ID);
}
};
}
/Chapter08_Notification2/src/com/amaker/ch08/app/MyReceiver.java
代码
package com.amaker.ch08.app;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
public class MyReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
// 实例化Intent
Intent i = new Intent();
// 在新的任务中启动Activity
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
// 设置Intent启动的组件名称
i.setClass(context, DisplayActivity.class);
// 启动Activity显示通知
context.startActivity(i);
}
}
/Chapter08_Notification2/res/layout/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"
>
<Button
android:text="发出广播"
android:id="@+id/Button01"
android:layout_width="wrap_content"
android:layout_height="wrap_content"></Button>
</LinearLayout>
代码
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.amaker.ch08.app"
android:versionCode="1"
android:versionName="1.0">
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".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>
<receiver android:name="MyReceiver">
<intent-filter>
<action android:name="com.amaker.ch08.app.MY_ACTION"/>
</intent-filter>
</receiver>
<activity android:name="DisplayActivity"/>
</application>
<uses-sdk android:minSdkVersion="3" />
</manifest>