ServiceConnection.onServiceConnected() 和 startService()

2024-02-14

我有一个非常简单的活动:

public class MainActivity extends Activity
{
    private Intent      serviceIntent;
    public  MainService mainService;

    public ServiceConnection sc = new ServiceConnection()
    {
        @Override
        public void onServiceConnected(ComponentName className, IBinder service)
        {
            mainService = ((MainService.MainServiceBinder)service).getService();
            Log.v("xxx", "[MainActivity]: onServiceConnected()");
        }

        @Override
        public void onServiceDisconnected(ComponentName arg0)
        {
            mainService = null;
            Log.v("xxx", "[MainActivity]: onServiceDisconnected()");
        }
    };

    @Override 
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        serviceIntent = new Intent(this, MainService.class);
    }

    @Override
    public void osStart()
    {
        super.onStart();
        // To call onServiceConnected() if the service already started
        bindService(serviceIntent, sc, BIND_DEBUG_UNBIND)
    }

    @Override
    public void onStop()
    {
        unbindService(sc);
        super.onStop();
    }

    // android:onClick procedure for Button in layout/main.xml
    public void doStartStopService(View Sender)
    {
        if(null == mainService)
        {
            startService(serviceIntent);
        }
        else
        {
            stopService(serviceIntent);
        }
    }
}

和一个非常简单的服务:

public class MainService extends Service implements Runnable
{
    private boolean isInterrupted = false;
    private Thread  thread;

    class MainServiceBinder extends Binder
    {
        MainService getService()
        {
            return MainService.this;
        }
    }

    @Override
    public void onCreate()
    {
        Log.v("xxx", "[MainService]: onCreate()");      
        super.onCreate();
        thread = new Thread(this);
        thread.start();
    }

    // 1.6 only
    @Override
    public void onStart(Intent intent, int startId)
    {
        super.onStart(intent, startId);
        Log.v("xxx", "[MainService]: onStart()");       
    }

    @Override
    public void onDestroy()
    {
        Log.v("xxx", "[MainService]: onDestroy()");     
        if(thread.isAlive())
        {
            isInterrupted = true;
        }               
        super.onDestroy();
    }

    @Override
    public IBinder onBind(Intent arg0)
    {
        Log.v("xxx", "[MainService]: onBind()");        
        return new MainServiceBinder();
    }

    @Override
    public boolean onUnbind(Intent intent)
    {
        Log.v("xxx", "[MainService]: onUnbind()");      
        return true;
    }

    @Override
    public void run()
    {
        Log.v("xxx", "[MainService]: run() started");

        while(!isInterrupted)
        {
            // ...
        }

        Log.v("xxx", "[MainService]: run() exiting");
    }

}

当我循环调用 doStartStopService() 时,我得到了下一个日志:

[1]首先startService():

02-10 07:31:49.775: V/xxx(16306): [MainService]: onCreate()
02-10 07:31:49.975: V/xxx(16306): [MainService]: onBind()
02-10 07:31:50.005: V/xxx(16306): [MainService]: onStart()
02-10 07:31:50.165: V/xxx(16306): [MainActivity]: onServiceConnected()
02-10 07:31:50.175: V/xxx(16306): [MainService]: run() started

[2]首先stopService():

02-10 07:31:52.205: V/xxx(16306): [MainActivity]: onServiceDisconnected()
02-10 07:31:52.205: V/xxx(16306): [MainService]: onUnbind()
02-10 07:31:52.215: V/xxx(16306): [MainService]: onDestroy()
02-10 07:31:52.235: V/xxx(16306): [MainService]: run() exiting

[3] 第二个 startService() - 没有 onBind() 和 onServiceConnected() 调用:

02-10 07:31:54.355: V/xxx(16306): [MainService]: onCreate()
02-10 07:31:54.365: V/xxx(16306): [MainService]: onStart()
02-10 07:31:54.365: V/xxx(16306): [MainService]: run() started

为什么当我第二次调用 startService() 时,函数 onBind() 和 onServiceConnected() 没有被调用?


如果您绑定到服务,则该服务onBind会打电话,所以第二个startService调用,没有绑定到该服务,您需要调用bindService(serviceIntent, sc, BIND_DEBUG_UNBIND) again.

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

ServiceConnection.onServiceConnected() 和 startService() 的相关文章

  • 将“R.id.myID”从字符串转换为 int 值 R.id.myID?

    我的观点上的文字代表一个ID 因此 当单击时 我想获得对该资源的引用 以下不正确的代码代表了我想要做的事情 public void onCreate Bundle savedInstanceState super onCreate save
  • 如何为 Android 创建我们自己的 PDF 查看器?

    我想构建一个可在我的 Android 应用程序中使用的 PDF 阅读器 查看器 但我无法使用 Google 文档来阅读我的内容 我无法使用我的设备中已安装的任何 PDF 阅读器 它应该位于我的应用程序内 并且不会通过互联网公开我的安全内容
  • 数据库“/data/data/msv_database.db”的连接池无法授予连接。连接数:0 个活动连接、1 个空闲连接、0 个可用连接

    我收到以下错误 在整个应用程序中使用单个数据库对象从两个不同线程访问数据库时 数据库连接池 data data msv database db 无法授予与线程 802 的连接 连接数 0 个活动连接 1 个空闲连接 0 个可用连接 也许您想
  • Android:java.lang.OutOfMemoryError:

    我在 Android 上开发了一个使用大量图像的应用程序 可绘制文件夹中有很多图像 比如说超过 100 张 我正在开发图像动画应用程序 我使用 imageview 来显示 GIF 图像 我使用了将 gif 图像分割成多个 PNG 格式图像的
  • 单击另一个项目/小部件时展开/打开微调器?

    当用户单击另一个按钮时 我试图展开微调器 例如 我有一个带有值的微调器和一个 确定 按钮 当用户单击 确定 按钮而不从微调器中选择任何值时 微调器会自行扩展 是否可以在无需用户与微调器交互的情况下获得扩展微调器的事件 只需致电Spinner
  • 在android Gridview中合并行和列

    我正在android中做一个图像查看页面 我需要在某些地方合并行 在某些地方合并列 我们可以在gridview中做到这一点吗 如果我们选择任何合并图像 则应选择整个图像视图 请任何人告诉我一个建议 提前致谢 Try 非对称网格视图 http
  • Android 软键盘 - 禁用某些键

    我正在寻找一种使用内置软键盘并禁用某些键的方法 例如 如果用户不应该使用字母 f 因为在列表中该字母不存在 则该键应显示为灰色 想象一下 用户可以在文本框中键入文本以从列表中进行选择 该列表包含 ABC BCCD 床 如果用户输入 A 然后
  • adb 今天无法连接到 VirtualBox 中的 Android-x86

    我在 VirtualBox 中成功安装了 Android x86 v3 2 eeepc 一段时间 这是帮助我在 Android 上调试 USB 主机应用程序的好方法 此类配置的安装是 安装VirtualBox 将 Android x86 v
  • 为什么我的地图视图上的叠加层没有显示?

    我按照 google hellomapview 教程中的说明进行操作 我得到了一个工作地图视图等 但是添加到地图中的两个项目没有显示 它们似乎在某个地方 因为点击指定位置会显示添加到项目中的消息 Edit 这是我的源代码 应该和google
  • 如果未安装应用程序,深层链接将重定向到 Play 商店

    我在我的应用程序中使用深度链接的概念 我真正想要的是 当我共享我的应用程序中的链接时 它工作正常 它会转到我想在我的应用程序中打开的活动 但问题是当用户没有这个时应用程序此链接通过手机浏览器打开 显示错误 未找到 但如果未安装应用程序 我想
  • NDK8d 未找到 std::string 操作(即 stol、stoi)

    我尝试使用 ndk r8d 和 c 11 支持来建立我的第一个 android 项目 一些 c 11 机制工作正常 即 lambda 表达式 但是当我尝试时 使用新的字符串操作之一 编译失败 错误 stol 不是 std 的成员 这是我的
  • 如何去掉android状态栏的电池图标?

    我通过去掉背景图像来删除 Android 中显示网络 电池和时间信息的状态栏 但图标仍然存在 我也想知道如何删除电池图标 不是用于应用程序 而是用于框架开发 提前致谢 你试过打电话吗 getWindow setFlags WindowMan
  • 作为 ViewPager 的一部分更新 ListFragment 中的数据

    我在 Android 中使用 v4 兼容性 ViewPager 我的 FragmentActivity 有一堆数据 这些数据将以不同的方式显示在我的 ViewPager 的不同页面上 到目前为止 我只有同一个 ListFragment 的
  • Android - 在图像/缩略图上覆盖播放按钮的最佳方式

    我有一个 Android 应用程序 可以播放音频 视频并显示图片 对于视频 我想在预览图像顶部以及列表视图中叠加一个播放按钮 现在我的做法是使用 xml 中的 ImageView 然后可绘制对象是一个图层图层列表 我以编程方式定义它 因为其
  • Android Lollipop 中应用程序外部配置文件和内部配置文件之间的数据传输

    相关问题安卓工作版 我的应用程序是一个设备管理员特权应用程序 现在我修改了创建托管工作配置文件并将其自身设置为配置文件所有者的代码 问题是 如果我upgrade我的应用程序 它成为设备管理员的配置文件所有者 现在将会有两份我的应用程序 一个
  • 线性布局高度和重量

    我有以下内容
  • Dart/Flutter 如何编译到 Android?

    我找不到任何具体的资源 Dart 是否被编译到 JVM 或者 Google 的团队是否编译了 Dart VM 以在 JVM 上运行 然后在 JVM 内的 Dart VM 中运行 Dart 前者更有意义 并且符合 无桥 的口号 但后者似乎更符
  • 如何在android中将文本放在单选按钮的左侧

    我想将单选按钮的文本放在左侧而不是右侧 我找到了这个解决方案
  • Recyclerview项目点击涟漪效果[重复]

    这个问题在这里已经有答案了 我正在尝试添加Ripple影响到RecyclerView的项目 我在网上查了一下 但找不到我需要的东西 我努力了android background归因于RecyclerView本身并将其设置为 android
  • 使用部分字符串匹配进行 Firebase 查询[重复]

    这个问题在这里已经有答案了 假设我有一个简单的 firebase 实时数据库结构 其中关键是username其值为userid 现在我想搜索userid by username 如果用户名匹配 这很容易 但如何获得部分匹配的答案 更清楚地说

随机推荐

  • 如何捕获 sqlalchemy 上的特定异常?

    我想捕获特定的异常 例如UniqueViolation关于 sqlalchemy 但是 sqlalchemy 只能通过以下方式抛出异常IntegrityError 所以我用下面的代码捕获了特定的异常 except sqlalchemy ex
  • 为什么 Apache 需要 SSLCertificateKeyFile?

    需要 SSLCertificateKeyFile 私钥 的技术原因是什么 它在哪里使用以及用于什么 SSL 证书文件包含 X 509 证书 该证书又包含用于加密的公钥 SSL 证书Key文件包含与证书中的公钥对应的私钥 为了让网络服务器加密
  • 使用特定数字类型而不是其他数字类型有何含义

    将整数存储为特定数字类型 uint8 int16 uint32 int64 等 对内存有何影响 我知道每种类型可以采用的整数范围 但是通过使用适当的类型是否可以实现一定的内存效率 例如 在 Golang 中 将某人的年龄存储为 uint8
  • std::out_of_range 异常不会抛出

    The following code works fine throwing a std out of range exception std vector
  • 了解 sprintf(...) 的危险

    OWASP http www owasp org index php Buffer Overruns and Overflows says C 库函数 例如 strcpy strcat sprintf 和 vsprintf 对以 null
  • 使用裸函数指针调用成员函数

    如果您有一个对象和一个指向成员的裸函数指针 那么调用成员函数的最佳方法是什么 本质上我想调用函数指针thiscall调用约定 背景 我正在动态查找共享库中的符号 获取工厂函数指针和指向我想要调用的某个成员函数的指针 成员函数本身不是虚拟的
  • 在 Skylake 中使用 MSR 正确禁用硬件预取

    我正在尝试禁用我的机器上的硬件预取 CPU系列 6 型号 78 型号名称 Intel R Core TM i5 6200U CPU 2 30GHz 我已经检查过 gcc march native Q help target grep Mar
  • 使用 EF 4.1 将父记录和多个子记录作为单个“工作单元”插入

    我正在练习一组代码优先的类 它们之间具有父子关系 public class Parent public int Id get set public string Name get set public List
  • 在 ejb3 中使用数据传输对象是否被认为是最佳实践

    虽然显然单个设计无法涵盖所有 场景 但现在是否普遍认为 ORM 类应该在表示层和业务层 本地或远程 之间来回传递 从而取代对数据传输对象的需求 据我所知 使用 ORM 类带来了不必要的急切加载 上下文管理问题和紧密耦合的问题 但也节省了大量
  • python27 errno 0 和 2 在简单的 for 循环打印中

    我只是使用 python27 在一个简单的 for 循环中打印变量 可以打印出部分结果 但是在输出过程中突然停止 并出现errno 0和2 描述为IOerror 我对这个错误感到非常困惑 这是我的简单代码 def checkPrint fo
  • touchesEnded:withEvent:如何解决触发前的延迟

    在 iPhone OS 上 touchesEnded withEvent 当您离开手指时会快速触发 除非有拖动 如果 touchesMoved withEvent 已触发 则在获得 TouchesEnded withEvent 之前大约有
  • 文本旁边的垂直对齐按钮中间

    我试图将按钮垂直对齐到中间 以便它更适合文本 我尝试过 center block 和 text center 但没有任何运气 我想要一个通用的解决方案 这样我就不会硬编码边距 填充等 这是我的小提琴 http jsfiddle net jh
  • 如何进行选择性 Mongo 恢复?

    假设我有一个Mongo具有两个数据库的副本集 一个主数据库和几个辅助数据库 db1 and db2 中学一所Mongo崩溃并丢失数据 现在当这个Mongo重新启动就会recover并复制both db1 and db2从初级开始 由于这样的
  • 如何在 matlab 中检索函数参数的名称?

    除了解析函数文件之外 还有没有办法获取matlab中函数的输入和输出参数的名称 例如 给定以下函数文件 divide m function value remain divide left right value floor left ri
  • Apple 在应用程序配置中“无法添加卡”

    我正在实施苹果应用程序内配置 并且遵循苹果指南中的所有步骤 但最后 我收到一条消息 无法添加卡 但没有任何错误抛出此过程 这就是我的创作方式PKAddPaymentPassViewController let cardInfoPass PK
  • 重新发送请求角度2

    在 Angular 2 应用程序中 每个对 API 的请求都有带有令牌的标头 以防令牌过期 API 会使用 401 http 代码进行响应 我有一种更新令牌的方法 但是在获取新令牌的过程中如何重新发送先前的请求以暂停其他请求 您可以延长Ht
  • googlemock - 模拟返回复杂数据类型的方法

    我想模拟一个返回复杂数据类型的方法 class aClass public virtual const QMap
  • 使用 jQuery 查找子项的索引?

    如果我有一个像这样的 html 结构 div div class child first div class sub child div div div class child second div class sub child div
  • 如何在SQL Server中查找包含TAB字符的字段

    在 SQL Server 中 识别表中某一列包含以下内容的所有行的最佳方法是什么 TAB特点 CHAR 9 是不是这么简单 SELECT FROM MyTable WHERE Field1 LIKE CHAR 9 RTRIMCHAR 列 像
  • ServiceConnection.onServiceConnected() 和 startService()

    我有一个非常简单的活动 public class MainActivity extends Activity private Intent serviceIntent public MainService mainService publi