服务 IntentService 前台服务 定时后台服务

Activity



public class MainActivity extends ListActivity {

    private int intentNumber = 0;

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        List<String> mData = new ArrayList<String>(Arrays.asList("启动一个新的工作线程", "启动一个前台服务", //

                "设置一次性定时后台服务", "设置一个周期性执行的定时服务", "取消AlarmManager的定时服务"));

        ListAdapter mAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, mData);

        setListAdapter(mAdapter);

    }

    @Override

    protected void onListItemClick(ListView l, View v, int position, long id) {

        switch (position) {

        case 0:

            intentNumber++;

            Intent intent = new Intent(this, MyIntentService.class);

            Bundle bundle = new Bundle();

            bundle.putInt("intentNumber", intentNumber);

            intent.putExtras(bundle);

            startService(intent);//每次启动都会新建一个工作线程,但始终只有一个IntentService实例

            break;

        case 1:

            startService(new Intent(this, ForegroundService.class));

            break;

        case 2:

            Intent intent2 = new Intent(this, LongRunningService.class);

            intent2.putExtra("type", "onceAlarm");

            startService(intent2);

            break;

        case 3:

            Intent intent3 = new Intent(this, LongRunningService.class);

            intent3.putExtra("type", "repeatAlarm");

            startService(intent3);

            break;

        case 4:

            ((AlarmManager) getSystemService(ALARM_SERVICE)).cancel(PendingIntent.getBroadcast(this, 0, new Intent(this, AlarmReceiver.class), 0));

            break;

        }

    }

}

IntentService


/** 所有请求的Intent记录会按顺序加入到【队列】中并按顺序【异步】执行,并且每次只会执行【一个】工作线程,当所有任务执行完后IntentService会【自动】停止 */

public class MyIntentService extends IntentService {

    public MyIntentService() { //必须实现父类的构造方法  

        super("MyIntentService");

    }

    @Override

    protected void onHandleIntent(Intent intent) {//注意,因为这里是异步操作,所以这里不能直接使用Toast。

        int intentNumber = intent.getExtras().getInt("intentNumber");//根据Intent中携带的参数不同执行不同的任务

        Log.i("bqt", "第" + intentNumber + "个工作线程启动了");

        try {

            Thread.sleep(3000);

        } catch (InterruptedException e) {

            e.printStackTrace();

        }

        Log.i("bqt", "第" + intentNumber + "个工作线程完成了");

    }

    @Override

    public IBinder onBind(Intent intent) {

        Log.i("bqt", "onBind");

        return super.onBind(intent);

    }

    @Override

    public void onCreate() {

        Log.i("bqt", "onCreate");

        super.onCreate();

    }

    @Override

    public int onStartCommand(Intent intent, int flags, int startId) {

        Log.i("bqt", "onStartCommand");

        return super.onStartCommand(intent, flags, startId);

    }

    @Override

    public void setIntentRedelivery(boolean enabled) {

        super.setIntentRedelivery(enabled);

        Log.i("bqt", "setIntentRedelivery");

    }

    @Override

    public void onDestroy() {

        Log.i("bqt", "onDestroy");

        super.onDestroy();

    }

}

前台服务


/**所谓的前台服务就是状态栏显示的Notification,可以让Service没那么容易被系统杀死  */

public class ForegroundService extends Service {

    @Override

    public IBinder onBind(Intent intent) {

        return null;

    }

    @Override

    public void onCreate() {

        super.onCreate();

        Notification.Builder localBuilder = new Notification.Builder(this).setContentIntent(PendingIntent.getActivity(this, 0, new Intent(this, MainActivity.class), 0))

                .setAutoCancel(false).setSmallIcon(R.drawable.ic_launcher).setTicker("Foreground Service Start").setContentTitle("前台服务").setContentText("正在运行...");

        startForeground(1, localBuilder.build());

    }

    @Override

    public void onDestroy() {

        Log.i("bqt", "onDestroy");

        super.onDestroy();

    }

}

定时后台服务


public class LongRunningService extends Service {

    public static final int anHour = 3 * 1000;//设置每隔3秒钟打印一次时间

    @Override

    public IBinder onBind(Intent intent) {

        return null;

    }

    @Override

    public int onStartCommand(Intent intent, int flags, int startId) {

        //定时任务为:发送一条广播。在收到广播后启动本服务,本服务启动后又发送一条广播……

        PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, new Intent(this, AlarmReceiver.class), 0);

        //使用【警报、闹铃】服务设置定时任务。CPU一旦休眠(比如关机状态),Timer中的定时任务就无法运行;而Alarm具有唤醒CPU的功能。

        AlarmManager manager = (AlarmManager) getSystemService(ALARM_SERVICE);

        long triggerAtTime;//闹钟(首次)执行时间

        String type = intent.getStringExtra("type");

        if ("onceAlarm".equals(type)) {//)//设置在triggerAtTime时间启动由operation参数指定的组件。该方法用于设置一次性闹钟

            triggerAtTime = SystemClock.elapsedRealtime() + anHour;//相对于系统启动时间,Returns milliseconds since boot, including time spent in sleep.

            manager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, triggerAtTime, pendingIntent);

        } else if ("repeatAlarm".equals(type)) {//设置一个周期性执行的定时服务,参数表示首次执行时间和间隔时间

            triggerAtTime = System.currentTimeMillis() + anHour;//相对于1970……绝对时间,Returns milliseconds since boot, including time spent in sleep.

            manager.setRepeating(AlarmManager.RTC_WAKEUP, triggerAtTime, anHour, pendingIntent);

        } else if ("work".equals(type)) {

            //开辟一条线程,用来执行具体的定时逻辑操作

            new Thread(new Runnable() {

                @Override

                public void run() {

                    Log.i("bqt", new SimpleDateFormat("yyyy.MM.dd HH-mm-ss", Locale.getDefault()).format(new Date()));

                }

            }).start();

        }

        /**type有五个可选值: 

        AlarmManager.ELAPSED_REALTIME  闹钟在睡眠状态下不可用,如果在系统休眠时闹钟触发,它将不会被传递,直到下一次设备唤醒;使用相对系统启动开始的时间

        AlarmManager.ELAPSED_REALTIME_WAKEUP  闹钟在手机睡眠状态下会唤醒系统并执行提示功能,使用相对时间

        AlarmManager.RTC  闹钟在睡眠状态下不可用,该状态下闹钟使用绝对时间,即当前系统时间

        AlarmManager.RTC_WAKEUP  表示闹钟在睡眠状态下会唤醒系统并执行提示功能,使用绝对时间

        AlarmManager.POWER_OFF_WAKEUP  表示闹钟在手机【关机】状态下也能正常进行提示功能,用绝对时间,但某些版本并不支持! */

        return super.onStartCommand(intent, flags, startId);

    }

}

广播接收者


public class AlarmReceiver extends BroadcastReceiver {

    @Override

    public void onReceive(Context context, Intent intent) {

        Toast.makeText(context, "定时任务已经执行了", Toast.LENGTH_SHORT).show();

        Intent workIntent = new Intent(context, LongRunningService.class);

        workIntent.putExtra("type", "work");

        context.startService(workIntent);

    }

}

清单文件


<?xml version="1.0" encoding="utf-8"?>

<manifest xmlns:android="http://schemas.android.com/apk/res/android"

    package="com.bqt.intentservice"

    android:versionCode="1"

    android:versionName="1.0" >

    <uses-sdk

        android:minSdkVersion="17"

        android:targetSdkVersion="21" />

    <application

        android:allowBackup="true"

        android:icon="@drawable/ic_launcher"

        android:label="@string/app_name"

        android:theme="@style/AppTheme" >

        <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>

        <service

            android:name=".MyIntentService"

            android:exported="false" >

            <intent-filter>

                <action android:name="com.test.intentservice" />

            </intent-filter>

        </service>

        <service android:name=".ForegroundService" />

        <service android:name=".LongRunningService" />

        <receiver android:name=".AlarmReceiver" />

    </application>

</manifest>

来自为知笔记(Wiz)

时间: 2024-10-16 17:17:08

服务 IntentService 前台服务 定时后台服务的相关文章

Android四大组件——Service后台服务、前台服务、IntentService、跨进程服务、无障碍服务、系统服务

Service后台服务.前台服务.IntentService.跨进程服务.无障碍服务.系统服务 本篇文章包括以下内容: 前言 Service的简介 后台服务 不可交互的后台服务 可交互的后台服务 混合性交互的后台服务 前台服务 IntentService AIDL跨进程服务 AccessibilityService无障碍服务 系统服务 部分源码下载 前言 作为四大组件之一的Service类,是面试和笔试的必备关卡,我把我所学到的东西总结了一遍,相信你看了之后你会对Service娓娓道来,在以后遇

Android-Service (基本知识,生命周期,实例-startService 启动的服务音乐播放器后台服务播放)

1.回顾 上篇 学习了 Android的四大组件之一 BroadCastReceiver 的 相关知识 2.重点 (1)Service 分类 (2)Service 的生命周期 (3)Service 标签 下的属性 (4)什么时候使用BindService 和 startService ? (5)实例 - 通过Service 服务 实现 音乐播放器 后台播放 3.Service 分类 3.1 按照地点分 (1)本地服务 服务依附在主进程上而不是独立的进程,这样在一定程度上节约了资源,另外Local

后台服务标准化运营

版权声明:本文由廖念波原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/148 来源:腾云阁 https://www.qcloud.com/community 为什么要服务标准化 一套互联网后台服务的开发和运营涉及到非常多的细节: 访问其他服务模块,服务端IP如何管理?网络报文格式是怎样的? 有哪些配置文件? 用到哪些第三方的库? 业务逻辑和基础框架是如何分离的? 对外提供怎样的网络接口?怎么对外提供接口API和文档? 运

Android官方开发文档Training系列课程中文版:后台服务之IntentService的创建

原文地址:http://android.xsoftlab.net/training/run-background-service/index.html 引言 除非特别指定,否则所有的操作都是在UI线程中执行的.不过这会引起问题,因为长时间的耗时操作会妨碍UI线程的运行.这会惹恼用户,并可能会引起系统错误.为了避免这样的情况出现,Android为此提供了一些类,可以使这些耗时操作放在单独的线程中执行.这里用到最多的就是IntentService了. 这节课主要学习如何实现IntentService

Android Services (后台服务)

一.简介 服务是可以在后台执行长时间运行的应用程序组件,它不提供用户界面. 另一个应用程序组件可以启动一个服务,并且即使用户切换到另一个应用程序,它仍然在后台运行. 另外,组件可以绑定到一个服务来与它进行交互,甚至执行进程间通信(IPC). 例如,服务可以从后台处理网络交易,播放音乐,执行文件I / O或与内容提供商交互. 这些是三种不同类型的服务: Scheduled(计划的服务)--- Android 5.0后可用当在Android 5.0(API级别21)中引入的诸如JobSchedule

highchart访问一次后台服务返回多张图表数据

本文承接上一篇,我们制作动态图表的时候,往往需要的不止一张图表,如果每张图表都与服务接口做一次交互的话未免太过频繁,这无论对前后还是后台都是一种压力,本文介绍一种一次访问返回多组数据的方式来减少前台与后台服务的交互,闲话少说,查看动态效果  →.→ 详细代码 ←.← 如上文所示,highchart 的 chart 属性可以添加 events 事件,上文中我们插入的事件为: events: { load: function () { var series = this.series[0]; var

Parse 构建移动APP后台服务(一)

目前正在开发的产品告一段落,有时间总结下经验,也顺便分享一下我们主要使用的平台-Parse. 什么是Parse? Parse是一群美国人开发的专为移动APP服务的云计算平台,与现有的其他云计算平台相比,Parse除了提供Restful的service 之外,也提供了官方的iOS和Android SDK.个人认为高质量的client端SDK是Parse区分与其他云服务的核心优势.为什么呢?看完我的文章就知道了. 为什么要用Parse? 先想想开发一个简单的需要保存用户数据的APP,你需要做什么.非

Android 三级联动选择城市+后台服务加载数据库

技术渣,大家将就着看 首先我们需要一个xml数据保存到数据库,这里我从QQ下面找到一个loclist.xml文件 <CountryRegion Name="中国" Code="1"> <State Name="北京" Code="11"> <City Name="东城" Code="1" /> <City Name="西城"

【原创】Linux后台服务相关问题总结

千言万语,不如实验来的直接... 基于sleep的小实验 首先通过实验直观感受一下后台服务的运行状况(请注意,前方高能,相关概念在更后面才有解释). 在命令行上以不同方式执行 sleep 确定登录 shell 和伪终端. [[email protected] ~]# ps ajxf PPID PID PGID SID TTY TPGID STAT UID TIME COMMAND ... 0 1 1 1 ? -1 Ss 0 0:02 /sbin/init ... 1 1654 1654 1654