Android 连接我的活动、服务和广播侦听器

Android 连接我的活动、服务和广播侦听器,android,service,broadcastreceiver,Android,Service,Broadcastreceiver,目前正在开发我的第一个Android应用程序。我是Android新手,但在大学里学过一点Java。PHP、JavaScript、C#和我的雇主专有语言(与BASIC一样)是我的背景,所以我对编程有很好的理解 该计划是: 带有切换按钮的活动性-开启时启动服务(如下) 位于后台并侦听特定TCP端口上的数据的服务 监控WiFi状态的广播接收器 我把这三个都准备好了——但似乎不知道如何连接它们 服务应该能够将数据发送回活动。如果活动终止,服务也应停止(但如果刚刚关闭,则不应停止-仅当应用程序终止时停

目前正在开发我的第一个Android应用程序。我是Android新手,但在大学里学过一点Java。PHP、JavaScript、C#和我的雇主专有语言(与BASIC一样)是我的背景,所以我对编程有很好的理解

该计划是:

  • 带有切换按钮的
    活动性
    -开启时启动服务(如下)
  • 位于后台并侦听特定TCP端口上的数据的
    服务
  • 监控WiFi状态的
    广播接收器
我把这三个都准备好了——但似乎不知道如何连接它们

服务
应该能够将数据发送回
活动
。如果
活动
终止,服务
也应停止(但如果刚刚关闭,则不应停止-仅当应用程序终止时停止)

如果WiFi更改为disconnected(断开连接),
BroadcastReceiver
应该能够停止服务并更新
活动

目前,这三个功能都是半独立工作的。
活动
可以停止并启动
服务
无需任何麻烦。
广播接收器
将在WiFi断开时显示一条
Toast
消息。这只是我不确定的内部通信

该应用程序是一个个人项目,完成后我将公开其来源。因此,我非常乐意与任何能够提供帮助的人共享当前代码。它位于

感谢您的帮助:)谢谢

解释。您可以绑定到服务并从中调用方法

Intent it = new Intent(MainActivity.this, MyService.class);
bindService(it, mConnection, Context.BIND_AUTO_CREATE);
绑定到每个活动中的服务,以便可以对其执行任何操作。 别忘了在你的活动中解开它的束缚

if(mBound)unbindService(mConnection);
只需拨打电话停止服务

stopService(new Intent(this, MyService.class));
这是我使用的serviceConnection

private ServiceConnection mConnection = new ServiceConnection() {

    @Override
    public void onServiceConnected(ComponentName className,IBinder service) {
        // We've bound to LocalService, cast the IBinder and get LocalService instance
        LocalBinder binder = (LocalBinder) service;
        mService = binder.getService();
        mBound = true;            
    }

    @Override
    public void onServiceDisconnected(ComponentName arg0) {
        mBound = false;
    }
}; 
将此项放在您的服务中以返回活动:

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

public class LocalBinder extends Binder {
    MyService getService() {
        // Return this instance of LocalService so clients can call public methods
        return MyService.this;
    }
}
最后,在启动服务
startService(intent)后将调用该函数
请注意,它返回
Service.START\u STICKY
。这将防止您的服务被终止,除非操作系统内存很少

public int onStartCommand(Intent intent, int flags, int startid) {      
    return Service.START_STICKY;
}

我希望我的回答能帮助你,祝你好运。

谢谢@robin!因此,假设我在
活动中有一个名为
doSomething(String sText)
的方法,我想从
服务调用它
我是否需要重新连接
LocalBinder
等?我还是不确定我能不能得到这个!:(我不会从活动中调用方法。该活动可能会被销毁。请将这些方法放在您的服务中。您可以从服务中调用方法,因为您将服务传递回活动mService=binder.getService();第二,解除绑定服务并不意味着将其销毁。当activty绑定到服务时,它几乎会被卡住。通过解除绑定,activty可以安全地销毁。您始终可以重新绑定到服务。请注意,服务不能启动两次,所以不要担心。啊,好的。因此,Activity调用服务上的方法,而不是ot她的方法。很好。第一阶段做得很好。仍然需要让广播接收器告诉服务停止。当然,另一种方法是可能的,但我不会这么做。