android 实现后台服务及源码下载

android APP后台服务可以长期与服务器进行长期的交互,保证数据的实时性,这个小项目主要实现的是在app退出之后依然可以运行服务。使用系统的Intent.ACTION_TIME_TICK进行实现,这个系统的广播每隔一分钟就进行广播一次,可以在程序中接收该广播消息,接收到之后检测app中的service服务是否在运行,如果在运行,则不处理,如果没有运行,则重新启动该service服务。

值得注意的是,虽然本示例可以实现后台运行服务的功能,但是当用户按home键进行清楚内存的时候依然可以把app清楚内存。app清楚内存之后,不再运行,当然也就不能实现什么功能(如接收消息推送),就是达不到像QQ、微信那样,清楚内存之后,QQ和微信依然在后台运行。

下面开始讲述本项目的实现过程。

我们知道,注册广播接收者有两种方式,一种是在配置文件中进行配置,另一种是在代码中进行注册。该广播需要在代码中进行注册。这里需要注意的是注册广播接收者可以在Activity中进行注册,但是如果在Activity中进行注册,必须在onDestory的时候进行注销广播接收者,如果不注销,会出现Error错误。有因为希望该广播接收者在app退出之后,依然能够接收到系统广播消息,所以此处注册系统的广播接受者应该在Application类中完成。

代码如下:

public class MyApplication extends Application {
    private static MyApplication myApplication;
    public MyApplication() {
    }
    public static MyApplication getInstance(){
        if (myApplication == null) {
            myApplication = new MyApplication();
        }
        return myApplication;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        IntentFilter intentFilter = new IntentFilter(Intent.ACTION_TIME_TICK);
        MyReceiver myReceiver = new MyReceiver();
        registerReceiver(myReceiver, intentFilter);
    }
}

在接收到系统广播的消息之后,利用自定义的广播接受者MyReceiver进行处理,在onReceive方法中检测要启动的Service类是否已经在后台运行,如果在后台运行,则不处理,如果没有在后台运行,则启动该服务。代码如下:

public class MyReceiver extends BroadcastReceiver {

    private final String TAG = MyReceiver.class.getSimpleName();
    public MyReceiver() {

    }

    @Override
    public void onReceive(Context context, Intent intent) {
        if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)) {
            Log.i(TAG, "监听到开机启动getAction");
        }else if(intent.getAction().equals(Intent.ACTION_TIME_TICK)){
            Log.i(TAG, "监听到TIME_TICK");
            boolean isServiceRunning = false;
            ActivityManager manager = (ActivityManager)context.getSystemService(Context.ACTIVITY_SERVICE);
            for (RunningServiceInfo service :manager.getRunningServices(Integer.MAX_VALUE)) {
            if("com.yin.service.MyService".equals(service.service.getClassName()))
                       //Service的全类名
                {
                    isServiceRunning = true;
                    Log.i(TAG, "已经启动");
                } 

            }
            if (!isServiceRunning) {
                Intent i = new Intent(context, MyService.class);
                context.startService(i);
                Log.i(TAG, "没有启动,现在启动");
            }

        }else {
            Log.i(TAG, "监听到其他");
        }
    }
}

下面给出MyService类的代码,该代码并不完成什么功能

public class MyService extends Service {

    private final String TAG = MyService.class.getSimpleName();

    public MyService() {

    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        flags = START_STICKY;
        //使用这样的标志因为该值会让系统在该service停止之后在进行启动,但是在清除内存之后是无效的
        return super.onStartCommand(intent,flags,startId);
    }

    @Override
    public void onCreate() {
        super.onCreate();
        Notification notification = new Notification();
        startForeground(-1, notification);
        Log.i(TAG, "Myservice类的oncreate方法");
    }

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        Intent service = new Intent(this, MyService.class);
        startService(service);//这里是一个取巧的方法,在该service销毁是在进行启动,但是清楚该app内存之后依然不能起作用
    }
}

下面给出配置文件代码:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.yin.servicetest"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="11"
        android:targetSdkVersion="20" />
    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme"
        android:persistent="true"
        android:name="com.yin.application.MyApplication" >
        <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>
        <receiver
            android:name="com.yin.servicetest.MyReceiver">
        </receiver>
        <service android:name="com.yin.service.MyService">

        </service>
    </application>
</manifest>

结果:

值得注意的是,虽然那可以达到后台运行的目的,但是如果在用户清楚内存之后这样的方法就不起作用了。如果大家有谁知道QQ或者微信如何实现在清楚内存之后如何实现依然在后台运行进程和服务的,请不吝赐教!【握手】

源码下载

时间: 2024-10-13 08:42:39

android 实现后台服务及源码下载的相关文章

《多合一麻将》(手机端+服务器+网站后台)全套完整源码下载

客户端源码是基于cocos2d-x 3.10版本开发的.代码完整可编译.本人在WINDOWS平台下成功编译了android包并正常运行.源码里面也有服务器的源码(C++),经过再次鉴定应该是配套的,服务器端有时间和能力的同学可以自己架设一下,我会给出所有的资源,包括后台管理程序(JAVA的),数据库文件,IP配置器等. 编译环境: windows7(64位)  + cocos3.13.1 + ndk13 + ant1.9.7 + python2.7.5 + android-sdk(20) + j

Android # 4.0.x(1-3) 源码 下载 编译

Android 4.0源码下载方法:repo init -u https://android.googlesource.com/platform/manifest -b android-4.0.1_r1 官方下载页面:http://source.android.com/source/downloading.html Android SDK 4.0官方下载页面:http://developer.android.com/sdk/android-4.0.html android 4.0.3最新源码下载

微信营销服务平源码下载地址

毫无疑问,在中国,移动互联网将是未来最大的趋势,如果你想在这个平台上,轻 松 创 业,快 速 赚 钱.下面的内容,将是您通向成功大门的 秘 密 武 器. 借力使力更省力 你可能是一个人,你可能是一个团队,你可能拥有一个公司,但无论如何,我们要想轻 松 赚 钱,最重要的一点,就是借力.而在移动互联网上,我们便可以借助于一强大的移动互联网平台--微信公众平台.http://pan.baidu.com/s/1c0tio9a微信营销服务平源码下载地址

android加固签名工具(源码下载)

背景 每次android加固了都要命令行签名好麻烦,正好之前做了个图标生成工具. 所以改了改,比写批处理还要省事. 原理 其实就是用winform程序调用控制台执行命令,android签名的命令如下 %JAVA_HOME%\bin\jarsigner -digestalg SHA1 -sigalg MD5withRSA -verbose -keystore [你的keystore] -signedjar [签名好的路径] [要签名的路径] [keystore的别名] 在界面里面选择了参数之后弹出

【Android 系统开发】CyanogenMod 13.0 源码下载 编译 ROM 制作 ( 手机平台 : 小米4 | 编译平台 : Ubuntu 14.04 LTS 虚拟机)

作者 : 韩曙亮 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/51592930 手机的两种模式 : 在下面有详细的图片示例; -- Recovery 模式 : 音量键增加 + 电源键, 长按上述组合键, 看到 "MI" 的 LOGO 后即进入 Recovery 模式; -- Fastboot 模式 : 音量键减小 + 电源键, 长按上述组合键, 看到 "FASTBOOT" 后, 即 进入 FA

彩票×××源码下载搭建

黄埔PHP版US盘口,高仿.net正版us时时彩,修复采集完美版 PHP版八合一盘口时时彩源码分享,带最新采集可自行测试 php版八合一盘口带动画时时彩源码,带最新采集自行测试us时时彩源码五合一盘口蓝色版本 亲测功能完美运营版58彩票时时彩程序源码,永久VIP免费下载!拉菲娱乐-HTML5全屏自适应带开奖软件+WAP独立端 8 2018新版微信娱乐系统,微信赛车,飞艇,时时彩,28,摩托等彩种!新快三天恒版程序带手机版 香港赛马开奖网带视频,后台可控,大神源码论坛独家分享 香港赛车PK10开奖

【流媒体开发】VLC Media Player - Android 平台源码编译 与 二次开发详解 (提供详细800M下载好的编译源码及eclipse可调试播放器源码下载)

作者 : 韩曙亮  博客地址 : http://blog.csdn.net/shulianghan/article/details/42707293 转载请注明出处 : http://blog.csdn.net/shulianghan VLC 二次开发 视频教程 : http://edu.csdn.net/course/detail/355 博客总结 : -- 本博客目的 : 让 Android 开发者通过看本博客能够掌握独立移植 VLC Media Player 核心框架到自己的 app 中,

完整版linux下android源码下载、编译、模拟器启动运行

一.环境说明: 1.VMware版本:8.0.3 build-703057 2.liunx系统:Ubuntu10.10 3.jdk:sun-java6-jdk 二.Ubuntu 10.10更新源列表 由于??Ubuntu 10.10版本的源已经过期了,所以,需要对其进行更新,Ubuntu 10.10 已经发布了,下面提供更新源方法与更新源列表地址: 1.sudo gedit /etc/apt/sources.list     编辑你的源列表,将原来的内容全部删除,添加下面的源,复制到你的列表中,

android Listview分批加载+自动加载(附源码下载)

直接上代码,代码有注释: public class TestForListviewActivity extends Activity implements OnScrollListener { private ListView mListview = null; private View mFooterView; private PaginationAdapter mAdapter; private Handler handler=new Handler(); private boolean i