Service

一、什么是Service?

Service是Android的四大组件之一,它可以在后台运行一些用户不可见的任务(比如播放音乐、下载)。它还可以在应用退出以后继续保持运行。

二、怎么使用Service?

1.首先要继承Service类得到一个子类。
2.跟Activity一样,需要在AndroidManifest.xml文件中注册

<service android:name=".Serevice.MyService"/>

3.与启动Activity类似,我们可以使用Intent来启动Service,启动方法为startService();

Intent startIntent = new Intent(this, MyService.class);
startService(startIntent);

Service与Activity不一样,如果不主动结束它的运行,它会一直保持运行。所以我们使用stopService()停止Service的运行。

Intent stopIntent = new Intent(this, MyService.class);
stopService(stopIntent);

三、Activity怎么与Service通信?

可以使用bindService()方法将Activity与Service绑定,使用unbindService()解除绑定。也可以使用bindService()方法来启动Service,而这种绑定方式启动的Service,只有解除所有绑定,Service才会销毁。

Intent bindIntent = new Intent(this, MyService.class);
bindService(bindIntent, connection, BIND_AUTO_CREATE);

其中connection声明如下,其中onServiceConnected方法会在Service与Activity建立关联的时候调用,可以在该方法里启动需要Service执行的任务并得到返回值。onServiceDisconnected方法会在Service与Activity解除关联的时候调用。

private ServiceConnection connection = new ServiceConnection() {

        @Override
        public void onServiceDisconnected(ComponentName name) {
        }

        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            myBinder = (MyService.MyBinder) service;
            myBinder.startDownload();
        }
};

四、Service生命周期

生命周期

五、前台Service

一般情况下,Service都是在后台运行,但是也可以让它运行在前台。
由于Service的系统优先级比较低,后台Service容易在系统内存不足的时候被杀死,而前台Service则可以解决这一问题。
创建前台service比较简单,在我们继承自Service类的子类的onCreate()方法中新建一个Notification

public  void showNotification(Context context) {
        Notification notification = new NotificationCompat.Builder(context)
                /**设置通知左边的大图标**/
                .setLargeIcon(BitmapFactory.decodeResource(context.getResources(), R.mipmap.ic_launcher))
                /**设置通知右边的小图标**/
                .setSmallIcon(R.mipmap.ic_launcher)
                /**通知首次出现在通知栏,带上升动画效果的**/
                .setTicker("通知来了")
                /**设置通知的标题**/
                .setContentTitle("这是一个通知的标题")
                /**设置通知的内容**/
                .setContentText("这是一个通知的内容这是一个通知的内容")
                /**通知产生的时间,会在通知信息里显示**/
                .setWhen(System.currentTimeMillis())
                /**设置该通知优先级**/
                .setPriority(Notification.PRIORITY_DEFAULT)
                /**设置这个标志当用户单击面板就可以让通知将自动取消**/
                .setAutoCancel(true)
                /**设置他为一个正在进行的通知。他们通常是用来表示一个后台任务,用户积极参与(如播放音乐)或以某种方式正在等待,因此占用设备(如一个文件下载,同步操作,主动网络连接)**/
                .setOngoing(false)
                /**向通知添加声音、闪灯和振动效果的最简单、最一致的方式是使用当前的用户默认设置,使用defaults属性,可以组合:**/
                .setDefaults(Notification.DEFAULT_VIBRATE | Notification.DEFAULT_SOUND | Notification.DEFAULT_LIGHTS)
                .setContentIntent(PendingIntent.getActivity(context, 1, new Intent(context, MainActivity.class), PendingIntent.FLAG_CANCEL_CURRENT))
                .build();
        notification.flags = Notification.FLAG_SHOW_LIGHTS;
        NotificationManager notificationManager = (NotificationManager) context.getSystemService(context.NOTIFICATION_SERVICE);
        /**发起通知**/
        notificationManager.notify(0, notification);
    }

通过初始化Notification和调用它的展示方法,这样该Service就变成了前台service。
Notification的setContentIntent方法的参数是一个PendingIntent,它可以让用户点击通知时去执行预设的任务,这里是打开MainActivity。
运行该Service,可以看到系统通知栏出现了一个通知,点击它会打开MainActivity。

六、什么是PendingIntent?

PendingIntent是一种特殊的Intent。它跟intent的立即执行不一样;它的执行不是立即的,是需要满足某些条件后才执行。
通过PendingIntent典型的三个静态方法可以得到其对象:

  • 打开到一个activity组件
public static PendingIntent getActivity(Context context, int requestCode,
            Intent intent, @Flags int flags)
  • 打开一个广播组件
 public static PendingIntent getBroadcast(Context context, int requestCode,
            Intent intent, @Flags int flags)
  • 打开一个服务组件
public static PendingIntent getService(Context context, int requestCode,
            @NonNull Intent intent, @Flags int flags)

因为PendingIntent自己携带了Context,所以即使Intent所在的程序结束了,PendingIntent依然有效,可以在别的程序中被使用。

七、远程Service

待续

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,657评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,662评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,143评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,732评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,837评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,036评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,126评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,868评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,315评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,641评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,773评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,470评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,126评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,859评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,095评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,584评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,676评论 2 351

推荐阅读更多精彩内容