在android中通过滑动删除应用程序时关闭服务

2024-04-20

当用户从当前运行的应用程序列表中删除应用程序时,我想关闭服务。在这里,我正在做的事情是,当用户启动应用程序时,服务就会启动并保持进行中。但是,当用户通过滑动删除应用程序时,就会创建新服务。我想关闭该服务。下面是我的代码。

// Start service using AlarmManager



    Calendar cal = Calendar.getInstance();
    cal.add(Calendar.SECOND, 10);

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

    PendingIntent pintent = PendingIntent.getService(this, 0, intent, 0);

    AlarmManager alarm = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
    alarm.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(),
                5000, pintent);
    startService(new Intent(getBaseContext(), MyService.class));

MyService.java

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.widget.Toast;

public class MyService extends Service {
    int count = 0;
    public MyService() {
    }

    @Override
    public IBinder onBind(Intent intent) {
        // TODO: Return the communication channel to the service.
        throw new UnsupportedOperationException("Not yet implemented");
    }

    @Override
    public void onCreate() {
        Toast.makeText(this, "The new Service was Created", Toast.LENGTH_LONG).show();

    }

    @Override
    public void onStart(Intent intent, int startId) {
        // For time consuming an long tasks you can launch a new thread here...
        count++;
        Toast.makeText(this, " Service Started" + "  " + count, Toast.LENGTH_LONG).show();

    }

    @Override
    public void onDestroy() {
        Toast.makeText(this, "Service Destroyed", Toast.LENGTH_LONG).show();

    }



}

据谷歌员工黛安娜·哈克伯恩 (Dianne Hackborn) 在对她的一位员工的评论中解释道Google+ 帖子 https://plus.google.com/105051985738280261832/posts/GfwRYCC42uX,您必须在您的服务上实现 onTaskremoved 。

[当您刷掉最近的任务时具体发生的情况是:(1) 杀死应用程序的任何后台或空进程(请参阅http://developer.android.com/guide/topics/fundamentals/processes-and-threads.html#Lifecycle http://developer.android.com/guide/topics/fundamentals/processes-and-threads.html#Lifecycle这意味着什么),并且(2)使用新的http://developer.android.com/reference/android/app/Service.html#onTaskRemoved(android.content.Intent) http://developer.android.com/reference/android/app/Service.html#onTaskRemoved(android.content.Intent)API 告诉应用程序的任何服务正在执行的任务 删除,以便它可以做任何它认为合适的事情。

所以我认为你可以这样做:在该回调中,你必须停止服务,并告诉警报管理器停止再次启动它。为此,首先,您需要将与 AlarmManger 一起使用的待处理意图传递给服务,以便服务可以使用该意图来取消计划。 至少,你需要这一切:

为您服务

public class MyService extends Service {
    private DefaultBinder mBinder;
    private AlarmManager  alarmManager ;
    private PendingIntent alarmIntent;

    private void setAlarmIntent(PendingIntent alarmIntent){
        this.alarmIntent=alarmIntent;
    }

    public void onCreate() {
        alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
        mBinder = new DefaultBinder(this);
    }

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

    public void onTaskRemoved (Intent rootIntent){
        alarmManager.cancel(alarmIntent);
        this.stopSelf();
    }
}

然后在其他文件中,创建 DefaultBinder 类

public class DefaultBinder extends Binder {
    MyService s;

    public DefaultBinder( MyService s) {
        this.s = s;
    }

    public MyService getService() {
        return s;
    }
}

在你的活动中

MyService service;
protected ServiceConnection mConnection = new ServiceConnection() {
    public void onServiceConnected(ComponentName className, IBinder binder) {
        service = ((DefaultBinder) binder).getService();
        service.setAlarmIntent(pIntent);
    }

    public void onServiceDisconnected(ComponentName className) {
        service = null;
    }
};

protected void onResume() {
    super.onResume();
    bindService(new Intent(this, MainService.class), mConnection,
            Context.BIND_AUTO_CREATE);
}

@Override
protected void onStop() {
    super.onStop();

    if (mConnection != null) {
        try {
            unbindService(mConnection);
        } catch (Exception e) {}
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在android中通过滑动删除应用程序时关闭服务 的相关文章

随机推荐

  • 创建片段时的NPE

    我正在创建一个关于Fragment with sensorEventlitener 主要活动主办fragment如下代码所示 但在运行时我收到下面发布的内容logcat Errors 主要活动 public class MainActivi
  • 用于查找应用于特定分支的标签的命令

    用于查找应用于特定分支的标签的命令 假设我有一个名为 BR test 的分支名称 我想知道该分支上应用的所有标签是什么 如果这是 UCM 一个简单的lsbl就足够了 cleartool lsbl stream myStream mypvob
  • Django 的内存错误

    我有一个 Django 应用程序 它将大量数据加载到 sqlite3 数据库文件中 我们正在谈论数百万个条目 这些条目输入到一个函数中 在执行的某个时刻会抛出异常 File root codebase lib python2 6 site
  • 从单例类中检索 Ruby 对象?

    可以访问单例类 https ruby doc org core 2 5 1 Object html来自 Ruby 对象 some object singleton class 是否可以进行相反的操作 在单例类中访问原始对象 class lt
  • 找不到 com.google.android.gms:play-services:7.3.0

    我有来自 Android Studio gradle 的日志 Error A problem occurred configuring project ParseStarterProject gt Could not resolve all
  • 返回对象中项目总数的最佳 RESTful 方法是什么?

    我正在为我参与的一个大型社交网站开发 REST API 服务 到目前为止 它运行良好 我可以发出GET POST PUT and DELETE请求对象 URL 并影响我的数据 但是 此数据是分页的 一次限制为 30 个结果 通过我的 API
  • 使用 php 缩短 if else 语句

    我有一个关于缩短 if else 语句的问题 我正在尝试使用制作天气应用程序打开天气地图 https openweathermap org weather conditionsAPI 但我不喜欢那些图标 我想像这样更改图标 if desc
  • 如何在 Android 上显示当前可见活动的对话框?

    我的问题类似于这个2年前的问题 https stackoverflow com questions 3136187 how to detect if any of my activity is front most and visible
  • lib 未指定 & loadNamespace 中出现错误

    我的一切都可以使用 R 和 RStudio 但后来我在清理计算机目录和文件时移动了文件夹 现在我收到以下错误消息 R和RStudio应该安装在Program Files or Program Files x86 我应该有两个libPaths
  • 如何爆炸空间分隔的柱子?

    我在 Spark Scala 中有一个示例数据框 其中包含一列和许多其他列 50 并且需要分解 id 示例数据 id name address 234 435 567 auh aus 345 123 muji uk 输出数据 id name
  • MySQL 的 COUNT 运行总计

    我知道set running sum 0 running sum running sum 方法 但是 它似乎不适用于我的情况 我的查询 SELECT DISTINCT date COUNT AS count FROM table1 WHER
  • 如何知道我的项目上运行的是哪个版本的 PyMongo

    我正在开发一个python项目 在需求文件中我有三种不同类型的PyMongo Flask PyMongo 0 3 1 pymongo 2 7 flask mongoengine 0 7 1 如何定义我正在使用哪个版本 如果你有pip安装后
  • 从 Android 打印到 AirPrint 打印机 [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 有谁听说过有人在 Android 上
  • 如何使用where子句从存储在PostgreSQL中jsonb列类型的JSON数组中修改或删除特定的JSON对象?

    在我的 Postgres 数据库中 我有一个具有 jsonb 数据类型的表列 在该列中 我存储 JSON 数组 现在 我想删除或修改数组内的特定 JSON 对象 我的 JSON 数组看起来像 ModuleId 1 ModuleName XY
  • 使用一项识别服务保护 2 个不同的 Web 应用程序

    使用一项识别服务保护 2 个不同的 Web 应用程序 身份服务 Thinktecture身份服务V2应用1 Asp net MVC 5应用应用2 Asp net Web API应用 上述应用程序1和应用程序2是不同的项目并托管在不同的服务器
  • 编译器是否优化了净零位移?

    我有一些代码 如下面的代码块 我不允许发布原始代码 cpp我认为正在编译的文件clang Ubuntu clang version 3 5 2 3ubuntu1 tags RELEASE 352 final based on LLVM 3
  • mysql 中的 Rank() 优于 Partition by

    我完全困惑于在mysql中从rank over partition by x order by y desc 创建一个新列 LoginRank 在sql server中 我将编写以下查询 以创建一个按 login 分组并按 id 排序的列
  • 在 AS3 中快速设置关键帧上的实例名称

    现在在 Flash CS3 及更高版本 使用 Actionscript 3 中 如果您在图层中的多个关键帧中使用相同的实例 并且您决定稍后分配或更改实例名称 则必须转到每个关键帧并设置实例名称 这是一个很大的麻烦 有没有更快或更好的方法来做
  • 为什么 _ destroy 在语句末尾?

    我看到了其他一些问题answers https stackoverflow com a 25877389 221955说明let foo 在语句末尾而不是在作用域退出时销毁结果 这就是let a foo does 我找不到任何官方描述 也找
  • 在android中通过滑动删除应用程序时关闭服务

    当用户从当前运行的应用程序列表中删除应用程序时 我想关闭服务 在这里 我正在做的事情是 当用户启动应用程序时 服务就会启动并保持进行中 但是 当用户通过滑动删除应用程序时 就会创建新服务 我想关闭该服务 下面是我的代码 Start serv