如何使后台服务始终在后台运行

时间:2017-08-27 08:48:52

标签: java android service background

我是android studio的新手并了解服务,我访问了这个页面:https://xjaphx.wordpress.com/2012/07/07/create-a-service-that-does-a-schedule-task/ 哪位作者提供了如下后台服务: 文件就像:

所以我创建了一个名为TimeService的服务:

public class TimeService extends Service {
    // constant
    public static final long NOTIFY_INTERVAL = 10 * 1000; // 10 seconds

    // run on another Thread to avoid crash
    private Handler mHandler = new Handler();
    // timer handling
    private Timer mTimer = null;

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

    @Override
    public void onCreate() {
        // cancel if already existed
        if(mTimer != null) {
            mTimer.cancel();
        } else {
            // recreate new
            mTimer = new Timer();
        }
        // schedule task
        mTimer.scheduleAtFixedRate(new TimeDisplayTimerTask(), 0, NOTIFY_INTERVAL);
    }

    class TimeDisplayTimerTask extends TimerTask {

        @Override
        public void run() {
            // run on another thread
            mHandler.post(new Runnable() {

                @Override
                public void run() {
                    // display toast
                    Toast.makeText(getApplicationContext(), getDateTime(),
                            Toast.LENGTH_SHORT).show();
                }

            });
        }

        private String getDateTime() {
            // get date time in custom format
            SimpleDateFormat sdf = new SimpleDateFormat("[yyyy/MM/dd - HH:mm:ss]");
            return sdf.format(new Date());
        }

    }

Andoid Manfest.xml

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

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <activity android:name=".MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

    <service
        android:name=".TimeService"
        android:enabled="true"
        android:exported="true"></service>
</application>

MainActivity.java是:

    package com.example.shubhamrajput.myapplication;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        startService(new Intent(this, TimeService.class));
    }

} 我在手机上测试了这个应用程序,但是当我从应用程序托盘中终止它时,它不能在后台运行,我想让它永远运行,直到用户从设置强制停止它,我该如何更改此代码?请提供详细说明,并提供修改后的代码,以便我能理解。如何将其作为前台服务?

2 个答案:

答案 0 :(得分:1)

你不应该在后台运行服务,因为它会一直使用CPU和内存。你最终会有非常糟糕的备用电池

您可以将Job Scheduler用于API级别大于21或Firebase Job Dispatcher以获得以下API级别21.使用此功能,您可以高效地解决重复性工作。

答案 1 :(得分:0)

您可以在不同的流程上运行该服务,因此无论应用程序如何,它都将始终运行

在清单文件

<service
   android:name=".TimeService"
  android:enabled="true"
  android:process=":my_process">
</service> 

您还可以使用START_STICKY 或者您可以按照Answer获取更多详细信息。