当某个应用不在前台运行,想发出一些提示信息时,就可以借助Notification来实现。
创建Notification首先需要创建NotificationManager实例来对其进行管理。
NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
然后通过support-v4库中的NotificationCompat类的构造器来创建Notification。
Notification notification = new NotificationCompat.Builder(context).build();
最后调用NOtificationManager的notify()方法让其显示出来,第一个参数是Notificaton的id。
manager.notify(1, notification);
但此时的Notification只是一个空的对象,可以通过在build()之前增加一系列set方法增添其功能。
分别指定Notification的标题内容和正文内容。
指定通知被创建的时间。
分别指定通知的小图标和大图标。
指定通知发出时播放一段音频。
指定通知发出时的振动频率,长整型的数组,下标为奇数的表示手机静止时长,下标为偶数的表示手机振动时长,单位为毫秒。
指定通知发出时的效果由手机环境来决定。
PendingIntent相当于一个延时执行的Intent,它提供了getActivity() getBroadcast() getService()方法来获得实例。
Intent intent = new Intent(this, anotherActivity.class);
PendingIntent pi = PendingIntent.getActivity(this, 0, intent, 0);
指定通知被点击后,会自动取消。
Service是一种计算型组件,用于在后台执行一系列计算任务。Service组件有两种运行模式:
创建Service的方法和静态注册BroadcastReceiver的方法类似
首先创建一个自定义Service类继承Service,并重写onBinder()方法。
另外,Service中处理事情的方法是onStartCommand()
class MyService extends Service{
public MyService{
}
@Override
public IBinder onBind(Intent intent){
return null;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId){
return super.onStartCommand(Intent intent, int flags, int startId);
}
}
然后在AndroidManifest.xml中进行注册
...
".MyServicer"
android:enabled="true"
android:exported="true">
...
启动Service的方法与启动Activity的方法类似,是由Intent触发的。然后调用Context的startService()方法。
停止Service则是调用Context的stopService()方法,或者在MyService内部调用stopSelf()方法。
Intent intent = new Intent(this, MyService.class);
startService(intent);
stopService(intent);
Activity与Service通信,是通过Activity绑定Service实现的。Context的bindService()方法和unbindService()分别用于绑定服务和解绑服务。
Intent intent = new Intent(this, MyService.class);
//BIND_AUTO_CREATE表示Activity与Service绑定后自动创建服务
bindService(intent, connection, BIND_AUTO_CREATE);
此方法的第二个参数是一个ServiceConnection类型的,ServiceConnection中有两个方法onServiceConnected()和onServiceDisconnected(),分别会在Activity与Service绑定和解绑时调用。
class MainActivity extends AppCompatActivity{
private MyService.MyBinder myBinder;
private ServiceConnection connection = new ServiceConnection(){
@Override
public void onServiceDisconnected(ComponentName name){
}
@Override
public void onServiceConnected(ComponentName name, IBinder service){
myBinder = (MyBinder) service;
myBinder.method();
}
};
}
在onServiceConnected()方法中IBinder向下转型得到一个MyBinder类型的实例,MyBinder是继承Binder在M有Service中实现内部类,并且可以在其中自定义一些方法,然后通过onServiceConnected()中调用,实现了Activity管理Service的目的。最后重写MyService类中的onBinder()方法,使得其他Activity绑定时,获取相同的MyBinder实例。
class MyService extends Service{
private MyBinder myBinder;
class MyBinder extends Binder{
public void method(){
//do something
}
}
@Override
public IBinder onBind(Intent intent){
return myBinder;
}
}
创建前台服务和创建通知很类似,只是在构建出Notification后,并没有使用NotificationManager的notify()将通知显示出来,而是调用了startForeground()方法让Service变成一个前台服务,并在系统状态栏显示出来。
Intent intent = new Intent(this, MainActivity.class);
PendingIntent pi = PendingIntent.getActivity(this, 0, intent, 0);
Notification notification = new NotificatonCompat.Builder(this).build();
startForeground(1, notification);