TCP 套接字的 Android 服务

2023-12-13

根据我在这里提出的上一个问题中的建议,我正在尝试为我已写入服务的应用程序推送套接字连接。昨天我花了一天的大部分时间研究服务,实际上模拟了一些服务(一个是远程的,一个是本地的)。

我的问题分为两部分:

1)在使用了本地服务和远程服务之后,我仍然不确定哪一个最适合我的情况。这在很大程度上是因为我想我仍然不太明白在另一个“进程”中运行会给我带来什么优势。无论如何,我都会为套接字连接生成一个新线程,因此我不会与 UI 发生任何线程争用。那么,将服务放入另一个进程中可以让我做什么呢?这样我可能会看到更好的性能吗?我有限的理解是,通过将其放入不同的进程中,该服务将独立于我在应用程序上运行的任何活动运行。我确实有一些不同的活动,但只有其中一个需要套接字连接,无论如何,每次打开该活动时我都会重建该连接。那么本地服务适合我吗?

2)我将在我的服务中设置我的套接字“侦听器”(DataInputStream().readLine() 在 while 循环内),以接收从服务器传递下来的任何新数据。在我昨天玩完之后,我不知道如何将它读取的数据“实时”传递给实际的“客户端”(远程服务绑定的客户端,或本地客户端本身)。

非常感谢对第 1 部分的一些建议,以及对第 2 部分的一些帮助(代码示例?:))

TIA

编辑:添加了我的服务的代码 - 使用本地服务

服务等级:

   public class SocketService extends Service {

    Socket s;
    PrintStream os;

    @Override
    public IBinder onBind(Intent arg0) {
        // TODO Auto-generated method stub
        return myBinder;
    }

    private final IBinder myBinder = new LocalBinder();

    public class LocalBinder extends Binder {
        public SocketService getService() {
            return SocketService.this;
        }
    }


    @Override
    public void onCreate() {
        super.onCreate();
        s = new Socket();
    }

    public void IsBoundable(){
        Toast.makeText(this,"I bind like butter", Toast.LENGTH_LONG).show();
    }

    public void onStart(Intent intent, int startId){
        super.onStart(intent, startId);
        Toast.makeText(this,"Service created ...", Toast.LENGTH_LONG).show();
        Runnable connect = new connectSocket();
        new Thread(connect).start();
    }

    class connectSocket implements Runnable {

        @Override
        public void run() {
            SocketAddress socketAddress = new InetSocketAddress("192.168.1.104", 4505);
            try {               
                s.connect(socketAddress);
            } catch (IOException e) {
                e.printStackTrace();
            }

        }

    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        try {
            s.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        s = null;
    }
}

调用服务的活动:

public class SocketServiceController extends Activity {

        private SocketService mBoundService;
        private Boolean mIsBound;
        public SocketServiceController ssc;
       @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            ssc = this;
            setContentView(R.layout.main);

            Button start = (Button)findViewById(R.id.serviceButton);
            Button stop = (Button)findViewById(R.id.cancelButton);

            start.setOnClickListener(startListener);
            stop.setOnClickListener(stopListener);

       }

       private ServiceConnection mConnection = new ServiceConnection() {
            public void onServiceConnected(ComponentName className, IBinder service) {
                mBoundService = ((SocketService.LocalBinder)service).getService();

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

        private void doBindService() {
            bindService(new Intent(SocketServiceController.this, SocketService.class), mConnection, Context.BIND_AUTO_CREATE);
            mIsBound = true;
            mBoundService.IsBoundable();
        }


        private void doUnbindService() {
            if (mIsBound) {
                // Detach our existing connection.
                unbindService(mConnection);
                mIsBound = false;
            }
        }

        @Override
        protected void onDestroy() {
            super.onDestroy();
            doUnbindService();
        }


       private OnClickListener startListener = new OnClickListener() {
        public void onClick(View v){
            startService(new Intent(SocketServiceController.this,SocketService.class));
            doBindService(); 

        }               
       };

       private OnClickListener stopListener = new OnClickListener() {
            public void onClick(View v){
                stopService(new Intent(SocketServiceController.this,SocketService.class));
            }               
          };
}

这很大程度上是因为我想我仍然不太明白跑步有什么优势 另一个“过程”将给我。

一般来说,没有。如果您希望其他应用程序与该服务进行通信,则可以创建远程服务。如果它仅由您自己的应用程序使用,请使用本地服务。

此外,远程服务与在应用程序中创建单独的进程无关。

这样我可能会看到更好的性能吗?

由于额外的内存消耗,您会发现这样的性能更差。

我有限的理解是,通过将其放在不同的进程中,该服务将独立运行 我在我的应用程序上运行的任何活动。

服务的生命周期独立于活动,无论是本地的还是远程的。

那么本地服务适合我吗?

听起来很有可能。

在我昨天玩完之后,我不知道如何将它读取的数据传递给 “实时”的实际“客户端”(通过远程服务绑定的客户端,或本地客户端本身)。

使用本地绑定模式,并让活动调用服务上的 API 来注册(和取消注册)事件侦听器。让服务通过侦听器将数据传递给活动。

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

TCP 套接字的 Android 服务 的相关文章

  • 如何从 SDK 实现每个会话的 Google Places 自动完成功能?

    是否可以从 Android 和 iOS 应用程序的 place sdk 实现基于会话的自动完成 根据 6 月 11 日生效的新 Google 地图框架定价 对自动完成的请求可以分为基于击键 会话的请求 我找不到描述实施步骤的文档 除了这个参
  • android edittext中的字符映射

    我想让我的编辑文本就像我写字符 g 时一样 它是相关的映射自定义字符应该写成印地语中的 我认为应该有字符映射 但没有知识任何人都可以帮助我 怎么做 其他应用程序https play google com store apps details
  • Xamarin Android Webview Javascript

    我正在尝试通过 Xamarin for Android 创建一个移动应用程序 它有一个显示网站的 WebView 问题是正常按钮会触发 但 javascript 事件不会触发 我已经启用了 Javascript 但没有运气 如何在 Andr
  • 按下按钮时应用不同的样式

    有没有办法在按下按钮时将样式应用于按钮 如果我有一种风格样式 xml
  • Gradle 构建错误:无法从 https://repo1.maven.org/maven2/io/fabric/tools/gradle/maven-metadata.xml 加载 Maven 元数据

    我在 Android studio 中遇到 gradle 构建错误 如下所示 Error A problem occurred configuring project MyApp Could not resolve all dependen
  • 如何使用 Google Maps for Android V2 处理地图移动结束?

    我想在地图中心更改后立即对地址进行地理编码 如何使用新的 Android 版 Google 地图 V2 处理地图移动 我说的是用户用手指拖动地图的情况 查看新的地图 API Override public void onMapReady G
  • 通过 WhatsApp 发送消息

    由于我发现了一些较旧的帖子 表明 Whatsapp 不支持此功能 我想知道是否发生了变化 以及是否有办法打开与我通过意图发送的号码进行 Whatsapp 聊天 UPDATE请参阅https faq whatsapp com en andro
  • Android 深度链接至 Instagram 应用

    Instagram 已经发布了 iOS 深层链接的 url 方案 但尚未为 Android 创建文档 有没有办法深入链接到 Android 上的 Instagram 应用程序 以转到 Instagram 应用程序中的特定位置 例如 Inst
  • Android Eclipse 上的 Web 服务

    我是 android eclipse java 的新手 事实上这个论坛也是如此 有人遇到过这种情况吗 从用户那里获取输入并通过使用 android eclipse 中的 Web 服务来显示适当的结果 有可用的示例吗 非常感谢 我正在发布教程
  • 当 OnFocusChangeListener 应用于包装的 EditText 时,TextInputLayout 没有动画

    不能比标题说得更清楚了 我有一个由文本输入布局包裹的 EditText 我试图在 EditText 失去焦点时触发一个事件 但是 一旦应用了事件侦听器 TextInputLayout 就不再对文本进行动画处理 它只是位于 editText
  • 使用片段时应用程序崩溃

    我正在处理碎片和 我的代码中有一个我找不到的问题 logcat 指向我的一个片段中的这段代码 Override public View onCreateView LayoutInflater inflater ViewGroup conta
  • logcat 中 mSecurityInputMethodService 为 null

    我写了一点android应显示智能手机当前位置 最后已知位置 的应用程序 尽管我复制了示例代码 并尝试了其他几种解决方案 但似乎每次都有相同的错误 我的应用程序由一个按钮组成 按下按钮应该log经度和纬度 但仅对数 mSecurityInp
  • 使用 AsyncTask 传递值

    我一直在努力解决这个问题 但我已经到了不知道该怎么办的地步 我想做的是使用一个类下载文件并将其解析为字符串 然后将该字符串发送到另一个类来解析 JSON 内容 所有部件都可以单独工作 并且我已经单独测试了所有部件 我只是不知道如何将值发送到
  • WorkManager 或 AlarmManager 用于日常请求然后通知工作?

    这是用例 用户设置具有特定时间的每日通知 在指定时间 发出网络请求以获取一些数据 然后使用检索到的数据显示通知 我不确定是否应该使用 AlarmManager 还是 WorkManager 来实现这个用例 据我了解 AlarmManager
  • Android 如何将总天数准确更改为年、月、日?

    我正在做一个应用程序 该应用程序与根据给定的生日日期输入获取一个人的年龄有关 为此 我从下面的代码中获取从该日期到当前日期的总天数 String strThatDay 1991 05 10 SimpleDateFormat formatte
  • 上网本上可以进行Android开发吗? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我想使用我的上网本进行 Android 开发 但是当我尝试使用 Eclipse 运行 SDK 时 没有加载任何内容 上网本对于 Android 开发来
  • Android:如何从网络异步获取搜索建议?

    我创建了一个可搜索的活动 现在 我想添加从网络服务获取的搜索建议 我想异步获取这些建议 根据添加自定义建议 http developer android com guide topics search adding custom sugge
  • 如何使用 AccessibilityService 在 Android 中模拟按键

    我正在编写一个辅助服务 我一直在尝试在应用程序上进行一些自动搜索 我使用accessibilityservice action paste来填充EditText 然后我需要模拟软键盘上的按键 但我不知道如何做 你们能帮我一下吗 你可以尝试A
  • Android 后台倒计时器

    我有一个 Android 应用程序 它管理一个倒计时器 类 CountDownTimer 它显示在应用程序屏幕中 以显示到达 00 00 还剩多少时间 我现在的问题是 当我按主页按钮或启动另一个应用程序时 应用程序 计时器不会在后台运行 所
  • Git 实验分支还是单独的实验存储库?

    我正在开发一个 Android 应用程序 并且在整个开发周期中一直使用 Git 现在 我想构建并发布实验性功能 供人们尝试和安装 同时仍将原始的 稳定的应用程序安装在他们的设备上 现在 这意味着我需要使用不同的包名称 这会更改开发项目中的一

随机推荐

  • 暂停所有其他视频,无论页面上有多少视频

    因此 我在一个多页面项目上使用 video js 该项目的页面每个页面上的视频数量不同 我想播放一个视频来暂停页面上播放的任何其他视频 我已经让它工作了 但我的代码只有在专门针对该页面制作时才有效 而不是单独处理每个页面 HTML 示例
  • 从抽象基类实现纯虚函数:重写说明符有什么意义吗?

    背景 我刚刚偶然发现了一个用例override说明符据我所知 这似乎是多余的 而且也没有任何特定的语义含义 但也许我遗漏了一些东西 因此这个问题 在继续之前 我应该指出 我试图在这里找到答案 但我得到的最接近的是以下线程 并没有真正回答我的
  • Selection.OnAction = "工作簿名称!Macroname"

    假设您有两个工作簿 一个名为 MyWorkbook 另一个名为 PatchMyWorkbook 两个工作簿在保存时都打开 PatchMyWorkbook 有一个宏 用于添加按钮并将 MyWorkbook 的现有宏分配给 MyWorkbook
  • Spring 中的 Elasticsearch HTTP 身份验证

    我想访问受用户名和密码保护的远程elasticsearch https 用户名 密码 aws eu west 1 portal1 dblayer com 11109 在 Spring 中 使用 XML 配置我能够访问我的本地主机弹性 如下所
  • 使用 Jackson 和 Spring-Boot 将 Base64 编码的 JSON 解码为 POJO

    我有一个这样的请求 varA A varB TCFNhbiBKb3NlMRgwFgYDVQQK 关键在哪里varB是一个 base64 编码的 JSON 字符串 像这样的东西 nestedVarB1 some value here nest
  • SymPy 仅打印函数名称

    我正在尝试在 SymPy 中进行一些符号计算 但我无法使用乳胶打印并获得我想要的图形输出 这一直困扰着我 并且花了几个小时 也许是几天 试图找到一种自定义对象打印方式的方法 在 LaTeX 中 在 pprint 表示中 它有很好的文档记录
  • redis dbsize命令的准确性

    准确度如何dbsizeredis 中的命令 我注意到返回的键数dbsize与返回的实际键数不匹配keys命令 这是一个例子 redis cli dbsize integer 3057 redis cli keys wc l 2072 Why
  • 无法调用匿名类方法

    我正在尝试调用一个方法 setPostal String post 我是从一个匿名类创建的 但由于某种原因 编译器在缅因州甚至无法识别它 这是有什么原因吗 我的代码的一部分 地址是Student的内部类 Student public cla
  • 当我们改变父对象的原型时 __proto__ 指向哪里?

    通常 当我们使用 new 关键字创建一个新对象时 实际上 原型 创建对象的属性指向原型父类的属性 我们可以如下测试 function myfunc myfunc prototype name myfunction var child new
  • 解决 JSONException 重复键

    我正在使用谷歌自定义搜索引擎并以 JSON 格式获取结果 对于某些查询 JSON 结果具有重复的键 因此它会产生 JSONException Duplicate key nickname 等 我正在使用JAVA String str con
  • ReadyStatement 忽略查询中的参数:java.sql.SQLException: 参数索引超出范围(1 > 参数数量,即 0)[重复]

    这个问题在这里已经有答案了 我使用java和jdbc驱动程序 java sql 我得到了这段代码 String clinetIP 220 181 108 89 String sql SELECT FROM as WHERE as ip ra
  • http2 模块 nginx 不工作

    我在 nginx 中启用 http2 协议时遇到一些问题 网站上写的是 Laravel 5 但我认为这并不重要 首先 我升级nginx版本 Debian nginx V nginx version nginx 1 10 1 built wi
  • int(x) 的作用是什么?

    我见过这些 看起来像是 C 代码中的函数 但我不知道它们做什么或是什么 它们似乎做与类型转换类似的事情 但它们看起来不像类型转换 那么它们是什么 它们看起来像这样 int x where x是一些数字输入 我一直在网上查找 但我无法找到有关
  • 如何加载 BeautifulSoup 页面解析器?

    帮助 请下载指定页面并找到她的元素 id login 一定需要用于查询模块请求 import pprint import requests import bs4 url http forum saransk ru html requests
  • Apache 反向代理不适用于 Node 和 SSL

    我正在尝试在 Web 服务器上的 HTTPS 上设置我的应用程序 我有一个使用 AutoSSL 安装在 InMotion 主机上的有效证书 我的 Node 应用程序在我的 Centos 服务器上的端口 3000 上运行 我的 apache
  • 标记(块)引用的作者的正确方法是什么?

    我正在尝试找出为引用添加归因的正确方法 互联网似乎对正确的方式存在分歧 Html5医生说如下 blockquote p A quote p blockquote
  • 根据所有其他列中是否存在 0/1 创建指示符列

    我经常发现自己必须应用以下条件 我有一个表 其中有多个评级为是 否或 0 1 的二进制列 我必须使用以下规则在计算中创建一个新的中间列 如果所有列均为 否 则新列为 否 如果至少一列具有 是 则摘要列必须表示 是的 我通常使用 case w
  • 如何使用 XPath/HTMLAgilityPack 读取 JavaScript 对象

    对于我的爬虫项目 我需要从 JavaScript 对象获取产品详细信息 如何从以下 JavaScript 中有效获取对象详细信息 我使用 XPath 和 HTMLAgilityPack
  • wordpress 致命错误:内存不足

    我已从 WHM gt PHP 配置编辑器将 php 内存限制从 whm 设置为 256M 即便如此 我的 WordPress 网站和管理员仍然向我显示如下错误 Fatal error Out of memory allocated 3617
  • TCP 套接字的 Android 服务

    根据我在这里提出的上一个问题中的建议 我正在尝试为我已写入服务的应用程序推送套接字连接 昨天我花了一天的大部分时间研究服务 实际上模拟了一些服务 一个是远程的 一个是本地的 我的问题分为两部分 1 在使用了本地服务和远程服务之后 我仍然不确