当前位置: 首页 > 知识库问答 >
问题:

android OregroundService被杀

寇甫
2023-03-14
public class MyForegroundService extends Service {

    private static String TAG = MyForegroundService.class.getSimpleName();

    private static final String CHANNEL_ID = "channel_01";
    private static final int NOTIFICATION_ID = 12345678;

    private NotificationManager mNotificationManager;

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

    public MyForegroundService() {
        super();
    }

    @Override
    public void onCreate() {
        super.onCreate();
        Log.d(TAG, "onCreate");

        mNotificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);

        // Android O requires a Notification Channel.
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            CharSequence name = getString(R.string.app_name);

            // Create the channel for the notification
            NotificationChannel mChannel = new NotificationChannel(CHANNEL_ID, name, NotificationManager.IMPORTANCE_DEFAULT);

            // Set the Notification Channel for the Notification Manager.
            mNotificationManager.createNotificationChannel(mChannel);
        }

        startForeground(NOTIFICATION_ID, getNotification());
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.d(TAG, "onStartCommand");

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

    @Override
    public void onDestroy() {
        super.onDestroy();
        Log.d(TAG, "onDestroy");

        stopForeground(true);
    }

    private Notification getNotification() {

        // Get the application name from the Settings
        String appName = PrefApp.getSettings(getApplicationContext()).getAppConfigs().getAppName();
        String applicationKey = PrefApp.getSettings(getApplicationContext()).getAppConfigs().getAppKey();

        NotificationCompat.Builder builder = new NotificationCompat.Builder(this)
                .setContentTitle(appName)
                .setContentText("Services are running")
                .setOngoing(true)
                .setPriority(Notification.PRIORITY_HIGH)
                .setSmallIcon(R.mipmap.ic_notification)
                .setWhen(System.currentTimeMillis());

        // Set the Channel ID for Android O.
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            builder.setChannelId(CHANNEL_ID); // Channel ID
        }

        return builder.build();
    }
}
public void startMyForegroundService() {
    Log.d(TAG, "Start Foreground Service");

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        startForegroundService(new Intent(getApplicationContext(), MyForegroundService.class));
    } else {
        startService(new Intent(getApplicationContext(), MyForegroundService.class));
    }
}

public void stopMyForegroundService() {
    Log.d(TAG, "Stop Foreground Service");
    stopService(new Intent(getApplicationContext(), MyForegroundService.class));
}

注意:我已经遵循了这个教程并测试了他们的应用程序,但它仍然不能工作。服务在一段时间后被取消。

基本上,我的目标是实现一个可以在后台运行的服务(即使当应用程序关闭时),并每分钟获得位置更新。

共有1个答案

庞乐池
2023-03-14

您可以使用firebase job dispatcher进行后台服务。

代码:添加此依赖项:

implementation 'com.firebase:firebase-jobdispatcher:0.8.5'

public class MyJobService extends JobService
{
    private static final String TAG = MyJobService.class.getSimpleName();

    @Override
    public boolean onStartJob(JobParameters job)
    {
        Log.e(TAG, "onStartJob: my job service class is called.");
        // enter the task you want to perform.
        return false;
    }

    @Override
    public boolean onStopJob(JobParameters job)
    {
        return false;
    }
}

在活动中创建一个工作,你可以像以前为后台服务做的那样做。

/**
 * 2018 September 27 - Thursday - 06:36 PM
 * create job method
 *
 * this method will create job
**/
private static Job createJob(FirebaseJobDispatcher dispatcher)
{
    return dispatcher.newJobBuilder()
            //persist the task across boots
            .setLifetime(Lifetime.FOREVER)
            //.setLifetime(Lifetime.UNTIL_NEXT_BOOT)
            //call this service when the criteria are met.
            .setService(MyJobService.class)
            //unique id of the task
            .setTag("TAGOFTHEJOB")
            //don't overwrite an existing job with the same tag
            .setReplaceCurrent(false)
            // We are mentioning that the job is periodic.
            .setRecurring(true)
            // Run every 30 min from now. You can modify it to your use.
            .setTrigger(Trigger.executionWindow(1800, 1800))
            // retry with exponential backoff
            .setRetryStrategy(RetryStrategy.DEFAULT_LINEAR)
            //.setRetryStrategy(RetryStrategy.DEFAULT_EXPONENTIAL)
            //Run this job only when the network is available.
            .setConstraints(Constraint.ON_ANY_NETWORK)
            .build();
}

/**
 * 2018 September 27 - Thursday - 06:42 PM
 * cancel job method
 *
 * this method will cancel the job USE THIS WHEN YOU DON'T WANT TO USE THE SERVICE ANYMORE.
**/
private void cancelJob(Context context)
{
    FirebaseJobDispatcher dispatcher = new FirebaseJobDispatcher(new GooglePlayDriver(context));
    //Cancel all the jobs for this package
    dispatcher.cancelAll();
    // Cancel the job for this tag
    dispatcher.cancel("TAGOFTHEJOB");
}
 类似资料:
  • 大家都知道英文中be动词+过去分词的组合,表示的是被动的意思,所以翻译时也多直接表达为“被xx”。一般情况下这样没有大问题,但我们再三说过,“条件反射式”的翻译,是翻译中的大忌。被动语态的处理也是如此,遇到被动语态就翻译为“被xx”,就会生出许多别扭,不信可以看下面几个句子: 我被邀请来参加这台晚会 这件事情被登上了报纸 此事被讨论之后 他被命令去执行任务 这本书被许多人高度评价 在这几个句子中,

  • 我有一个如下所示的集合,我想过滤掉除了不是月末的日期之外的所有内容。 我有以下筛选条件<代码>频率。getEnd返回与给定月底匹配的

  • 我是写测试和使用Mockito的新手。我在Stackoverflow上阅读了类似的主题,并做了建议的更改,确保所考虑的类/接口/方法是开放的。 我试图跟踪这个 模仿构造函数注入的依赖项 这是我目前想出来的测试 但我一直得到的回应是 即使我在测试中没有提到这种方法,我也得到了这种反应。这是我的演示者注册方法。我已经改变了类/接口 同样地 这里是接口 感谢您的帮助。

  • 我是Android系统的新手,所以请原谅我。我的主要活动在警报管理器中创建警报,假设在特定的时间内发射,我的主要活动还创建广播接收器,假设接收警报发射的意图,一切都正常工作,直到任务管理器杀死我的应用程序。我已经检查了AlarmManager中的PendingIntent列表,并验证我的警报正在从警报管理器中删除,我试图添加服务并从服务中注册警报,我红了,可能是因为我的广播接收器的IntentFi

  • 我有一个实现远程后台服务的应用程序。这个服务是用来下载线程中的文件的(我想说这个服务是作为下载管理器工作的)。 当我想下载一个文件时,我将url发送给服务,服务启动一个线程(我使用的是AsyncTask,但它只在Android4.1中工作)。但下载迟早会停止,我能够知道这一点,因为我显示的通知不再更新。当我单击取消下载的通知时,将向服务发送一个挂起的意图,告诉它取消下载,但当服务重新创建时,将取消

  • 重庆一小公司  面试  JAVA  本科应届  51分钟。 0八股文  一开始挺正常 后面就不了。 基本是一些场景题目 sql 1.id  name   age  查找姓陈开始的名字,看着题目挺简单的吧。回答完整sql就行。 因为是口头回答 有点像伪代码  我说 select  id name  age   from 表明 然后通过like  陈% 面试官说 有两个细节  where 关键字 没说