界面很简单,功能也实现的很简单,
一个简单的DEMO,
欢迎转载,请加地址
1主页面
2点击开启发送后
设置每隔10秒发送1次直到用户点击通知栏或点击停止发送
点击通知栏,会跳转
首先的一点是,为了能使所有Actvity都能方便的调用同一对象或者方法,我自定义了Application
public class AllApplication extends Application{
public ScheduledExecutorService scheduledThreadPool;
@Override
public void onCreate() {
// TODO Auto-generated method stub
super.onCreate();
scheduledThreadPool=null;
}
}
为了使这个Application生效,需要在AndroidManifest.xml中替换原来的
<application
android:name=".AllApplication"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
</application>
不多说,直接上代码,注释就在代码里
首先是两个简单的布局文件
activity_notification_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<Button
android:id="@+id/Button1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="开启发送通知栏"/>
<Button
android:id="@+id/Button2"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="停止发送通知栏"/>
</LinearLayout>
activity2.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/text1"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@drawable/setbar_bg"
/>
</LinearLayout>
主文件NotificationMainActivity.java
public class NotificationMainActivity extends Activity implements OnClickListener {
private static Button button1,button2;
private AllApplication application;
public NotificationManager mNotificationManager;
//定义count为通知内容用以测试
public int count=0;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_notification_main);
// 获取全局上下文对象
application=(AllApplication) getApplication();
button1=(Button)findViewById(R.id.Button1);
button1.setOnClickListener(this);
findViewById(R.id.Button2).setOnClickListener(this);
}
public void onClick(View v) {
// TODO Auto-generated method stub
switch (v.getId()) {
case R.id.Button1:
count=0;
/**创建一个可安排在给定延迟后运行命令或者定期地执行的线程池。 效果类似于Timer定时器
* ScheduledThreadPool是一个固定大小的线程池,与FixedThreadPool类似,执行的任务是定时执行。
* */
application.scheduledThreadPool = Executors.newScheduledThreadPool(1);
//5秒后执行,以后每10秒执行一次
application.scheduledThreadPool.scheduleWithFixedDelay(new CustomTask(), 5, 10,
TimeUnit.SECONDS);
break;
case R.id.Button2:
application.scheduledThreadPool.shutdown();
application.scheduledThreadPool=null;
//取消通知栏显示
mNotificationManager.cancel(100);
break;
}
}
class CustomTask implements Runnable {
public void run() {
// TODO Auto-generated method stub
Bundle date=new Bundle();
date.putInt("count", count++);
Message message = Message.obtain(sHandler, 1);
message.setData(date);
message.sendToTarget();
}
}
private Handler sHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
super.handleMessage(msg);
switch (msg.what) {
case 1:
int counts=msg.getData().getInt("count");
mNotificationManager= (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
//手机最上方提示栏的内容
Notification notification = new Notification(R.drawable.ic_launcher,
"count值发生变化当前为"+count, System.currentTimeMillis());
/**
* 设置添加声音
* 或者使用以下几种方式
* notification.sound = Uri.parse("file:///sdcard/notification/ringer.mp3");
* notification.sound = Uri.withAppendedPath(Audio.Media.INTERNAL_CONTENT_URI, "6");
* 如果想要让声音持续重复直到用户对通知做出反应,则可以在notification的flags字段增加"FLAG_INSISTENT"
* 如果notification的defaults字段包括了"DEFAULT_SOUND"属性,则这个属性将覆盖sound字段中定义的声音
* 还可以添加震动 notification.defaults |= Notification.DEFAULT_VIBRATE;
* 或者可以定义自己的振动模式:
* long[] vibrate = {0,100,200,300}; //0毫秒后开始振动,振动100毫秒后停止,再过200毫秒后再次振动300毫秒
* notification.vibrate = vibrate;
* */
notification.defaults |= Notification.DEFAULT_SOUND;
/**
* notification.flags |= FLAG_AUTO_CANCEL; //在通知栏上点击此通知后自动清除此通知
* notification.flags |= FLAG_INSISTENT; //重复发出声音,直到用户响应此通知
*/
notification.flags = Notification.FLAG_AUTO_CANCEL;
//通知栏的title
CharSequence contentTitle = "测试";
//通知栏的内容
CharSequence contentText="count值发生变化快去看看吧";
//当点击通知栏时给其设置一个跳转的页面
Intent notificationIntent = new Intent();
notificationIntent.setClass(getApplicationContext(),
Activity2.class);
//在这里传值给点击跳转的Intent
notificationIntent.putExtra("count", counts);
PendingIntent contentIntent = PendingIntent.getActivity(
getApplicationContext(), 0, notificationIntent,
PendingIntent.FLAG_UPDATE_CURRENT);
//将上面的设置加入通知栏
notification.setLatestEventInfo(getApplicationContext(),
contentTitle, contentText, contentIntent);
// 用mNotificationManager的notify方法通知用户生成标题栏消息通知
//这里的ID100,用来定义状态栏通知以及下拉任务栏通知,并且用来在需要的时候,将这两样取消
mNotificationManager.notify(100, notification);
break;
default:
break;
}
}
};
@Override
protected void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
}
}
点击跳转后的文件Activity2.java
public class Activity2 extends Activity{
private AllApplication application;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
application=(AllApplication) getApplication();
application.scheduledThreadPool.shutdown();
application.scheduledThreadPool=null;
setContentView(R.layout.activity2);
Bundle bundle=getIntent().getExtras();
int count=bundle.getInt("count");
TextView textView=(TextView)findViewById(R.id.text1);
textView.setText("当前count值为"+count);
}
}
好了,全部代码都在这里了。。。有不足的地方欢迎大家指正