一、Service的分类
◆ 按所在进程
● Local:本地Service,即当前进程的Service;
● Remote:远程Service,指另外一个进程的Service;
● 区别:本地Service依附在主进程上,一定程度上能够节约资源,且通讯比较方便。但如果主进程被杀掉了,该Service也会被杀掉;远程Service是一个独立的进程,它不受其他进程的影响,具有一定的灵活性。
◆ 按展现方式
● 前台服务:在通知栏一直显示,可以最大程度保证Service不被关闭,优先级比后台服务更高;
● 后台服务
二、Android的通知 —— Notification
当某个应用程序希望向用户发出一些提示消息,而该应用程序又不在前台运行时,就可以借助通知来实现。通知可以在活动、广播和服务里创建,不过再活动里创建的情况比较少,因为只有当程序进入后台才会用到通知。
public void onCreate() {
super.onCreate();
//创建NotificationManager来对通知进行管理
NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
/**
* 创建Notification对象
第一个参数用于指定通知的图标,第二个参数用于指定通知的ticker内容,当通知被创建后,它会在状态栏一闪而过,属于一种瞬时的提示消息
第三个参数指定通知被创建的时间
*/
Notification notification = new Notification(R.drawable.img123,"我的音乐",System.currentTimeMillis());
//跳转意图,当点击通知时跳转页面
PendingIntent pendingIntent = PendingIntent.getActivity(this,0,new Intent(this,MainActivity.class),0);
/**
* 对通知的布局设定
* 第二个参数指定通知的标题
* 第三个参数指定通知的正文内容
*/
notification.setLatestEventInfo(this,"title","content",pendingIntent);
/**
* 让通知显示出来
* 第一个参数是id,要保证每个通知所指定的id都不同
*/
notificationManager.notify(1,notification);
完成了通知栏的显示和点击事件后,一般我们要跳转到页面后状态栏自动消失,那怎么做呢?
在跳转页面的onCreate方法中,添加取消通知的代码:
public class NotificationActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.notification_layout);
NotificationManager manager = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);
manager.cancel(1);
}
}
三、使用service的注意事项
1. service是在主线程中的,所以不能进行耗时操作;
2. 当旋转手机屏幕,竖屏变横屏时,activity是重新创建的,所以service的binder和activity会自动断开;
3. 在service中创建子线程和在activity中创建子线程的区别:
3. 在service中创建子线程和在activity中创建子线程的区别:
在activity中创建子线程,当activity被销毁时,就无法获取之前创建的子线程的实例了。而且在activity中创建的子线程是无法供其他activity进行操作的;而service就不一样了,所有的activity都可以和它进行关联,即使activity销毁了,也可以执行这个子线程;
拾遗:
1. context——上下文,可以这么理解:每一段代码都有很多外部变量。一旦你的程序有了外部变量,这段程序就不能独立运行,就要把所有外部变量的值一个一个写进去,这些外部变量的总和叫做上下文。即运行环境。
2. 想要知道所在线程是在哪个线程中,可以用log把当前线程打出来:
Log.d(TAG , "Activity thread id:" + Thread.currentThread().getId());