Service和Activity交互之广播方式

一.使用场景
如果要通知多个Activity,广播较为适合.但广播较为耗费性能.

 

二.Broadcast更新Activity中的UI

1.新建一个接口OnUpdateUI,用于回调更新UI

public interface OnUpdateUI {
    void updateUI(String i);
}

 

2.BroadcastReceiver代码

public class MyBroadcast extends BroadcastReceiver {

    OnUpdateUI onUpdateUI;
    @Override
    public void onReceive(Context context, Intent intent) {
        String progress = intent.getStringExtra("progress");
        onUpdateUI.updateUI(progress);
    }

    public void SetOnUpdateUI(OnUpdateUI onUpdateUI){
        this.onUpdateUI = onUpdateUI;
    }

}

 

3.Activity中代码:

public class MainActivity extends Activity {

    public static final String FLAG = "UPDATE";
    MyBroadcast myBroadcast;
    TextView tip;
    Intent intent;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        tip = (TextView)findViewById(R.id.tip);

        myBroadcast = new MyBroadcast();
        IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction(FLAG);
        registerReceiver(myBroadcast, intentFilter);

        intent = new Intent(this, MyService.class);
        
    // 更新UI
        myBroadcast.SetOnUpdateUI(new OnUpdateUI() {
            @Override
            public void updateUI(String i) {
                tip.setText(i);
            }
        });
    }

    protected void myClick(View v){
    // 发送广播
        if( v.getId() == R.id.btn ){
            Intent intent = new Intent();
            intent.setAction(FLAG);
            intent.putExtra("progress", System.currentTimeMillis()+"");
            sendBroadcast(intent);
        }

    // 启动服务
        if (v.getId() == R.id.btn2){
            startService(intent);
        }
    }

    @Override
    protected void onDestroy() {
        unregisterReceiver(myBroadcast);
        stopService(intent);
        super.onDestroy();
    }
}

三.Service发送广播,广播更新Activity中UI

Service发送广播

Intent it = new Intent();
it.setAction(MainActivity.FLAG);
it.putExtra("progress", i+"");
sendBroadcast(it);

 

转载于:https://www.cnblogs.com/itfenqing/p/6752105.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 好的,我很乐意为您提供帮助。在Java中,ServiceActivity是Android应用程序中的两个重要组件,它们之间的交互可以通过以下几种方式实现: 1. Intent:通过Intent对象来启动一个ServiceActivity,可以在它们之间传递数据和参数。 2. Binder:通过Binder机制来实现ServiceActivity之间的通信,Binder提供了一种进程间通信方式,可以让Activity通过Service来执行一些耗时的操作。 3. 回调函数:在Service中定义一些回调函数,在Activity中实现这些函数并传递给ServiceService可以通过调用这些函数来将操作结果返回给Activity。 下面是一个简单的示例,演示了如何在Java中编写一个Service和一个Activity,并且通过上述三种方式实现它们之间的交互Service示例代码: ```java public class MyService extends Service { private MyCallback callback; //定义回调接口 public interface MyCallback { void onResult(String result); } //注册回调函数 public void setCallback(MyCallback callback) { this.callback = callback; } @Override public int onStartCommand(Intent intent, int flags, int startId) { //执行一些耗时的操作 String result = "Hello from Service"; //回调函数,将结果返回给Activity if (callback != null) { callback.onResult(result); } return START_NOT_STICKY; } @Nullable @Override public IBinder onBind(Intent intent) { return new MyBinder(); } //定义Binder类 public class MyBinder extends Binder { public MyService getService() { return MyService.this; } } } ``` Activity示例代码: ```java public class MainActivity extends AppCompatActivity { private MyService.MyBinder binder; private MyService service; //实现回调函数 private MyService.MyCallback callback = new MyService.MyCallback() { @Override public void onResult(String result) { Toast.makeText(MainActivity.this, result, Toast.LENGTH_SHORT).show(); } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //启动Service Intent intent = new Intent(this, MyService.class); bindService(intent, serviceConnection, Context.BIND_AUTO_CREATE); } //绑定Service private ServiceConnection serviceConnection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName componentName, IBinder iBinder) { binder = (MyService.MyBinder) iBinder; service = binder.getService(); //注册回调函数 service.setCallback(callback); } @Override public void onServiceDisconnected(ComponentName componentName) { service = null; } }; @Override protected void onDestroy() { super.onDestroy(); //解绑Service unbindService(serviceConnection); } } ``` 以上就是一个简单的ServiceActivity交互示例,希望能对您有所帮助。 ### 回答2: 在Android开发中,ServiceActivity是两个重要的组件,它们可以通过Intent进行交互。下面是使用Java代码实现ServiceActivity之间的交互的示例: 首先,创建一个Service类,继承自Service,并重写onStartCommand方法。在该方法中,可以执行一些耗时操作,例如进行网络请求或其他计算任务。在完成任务后,可以通过广播将结果发送给Activity。 ``` public class MyService extends Service { @Override public int onStartCommand(Intent intent, int flags, int startId) { // 执行耗时操作 // 将结果发送给Activity Intent broadcastIntent = new Intent(); broadcastIntent.setAction("com.example.ACTION_RESULT"); broadcastIntent.putExtra("result", result); sendBroadcast(broadcastIntent); return super.onStartCommand(intent, flags, startId); } ... } ``` 接下来,在Activity中注册一个广播接收器,并在合适的位置发送启动Service的请求。当Service执行完任务后,会发送一个广播Activity会接收到该广播,并在广播接收器中处理返回的结果。 ``` public class MyActivity extends AppCompatActivity { private BroadcastReceiver receiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { if (intent.getAction().equals("com.example.ACTION_RESULT")) { // 处理接收到的结果 String result = intent.getStringExtra("result"); // ... } } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_my); // 注册广播接收器 IntentFilter filter = new IntentFilter(); filter.addAction("com.example.ACTION_RESULT"); registerReceiver(receiver, filter); // 发送启动Service的请求 Intent serviceIntent = new Intent(this, MyService.class); startService(serviceIntent); } @Override protected void onDestroy() { super.onDestroy(); // 销毁时解注册广播接收器 unregisterReceiver(receiver); } ... } ``` 通过以上的示例,ServiceActivity之间可以通过广播进行交互Service执行完任务后将结果发送给ActivityActivity接收到结果后可以进行相应的处理。当然,这只是其中一种实现方式,根据具体需求还可以使用其他方式进行交互,例如使用Messenger、Binder等。 ### 回答3: 在Java中,ServiceActivity之间的交互可以通过使用Intent、Broadcast Receiver或者回调函数来实现。下面我将给出一个用Java编写的示例来展示ServiceActivity之间的交互。 首先,我们创建一个Service类,命名为MyService。在该类中,我们编写一个用于计算两个数相加的方法,然后通过Broadcast发送结果给Activity。 ```java import android.app.Service; import android.content.Intent; import android.os.Binder; import android.os.IBinder; public class MyService extends Service { private LocalBinder binder = new LocalBinder(); public class LocalBinder extends Binder { MyService getService() { return MyService.this; } } @Override public IBinder onBind(Intent intent) { return binder; } public int addNumbers(int a, int b) { return a + b; } public void sendDataToActivity(int result) { Intent intent = new Intent("com.example.myapplication.RESULT_ACTION"); intent.putExtra("RESULT", result); sendBroadcast(intent); } } ``` 接下来,我们创建一个Activity类,命名为MainActivity。在该类中,我们绑定Service,并通过回调函数接收并显示Service传递的计算结果。 ```java import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.os.Bundle; import android.widget.TextView; import androidx.appcompat.app.AppCompatActivity; public class MainActivity extends AppCompatActivity { private MyService myService; private TextView resultTextView; private BroadcastReceiver receiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { int result = intent.getIntExtra("RESULT", 0); resultTextView.setText("计算结果:" + result); } }; private ServiceConnection connection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName componentName, IBinder iBinder) { MyService.LocalBinder binder = (MyService.LocalBinder) iBinder; myService = binder.getService(); } @Override public void onServiceDisconnected(ComponentName componentName) { myService = null; } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); resultTextView = findViewById(R.id.resultTextView); } @Override protected void onStart() { super.onStart(); IntentFilter filter = new IntentFilter("com.example.myapplication.RESULT_ACTION"); registerReceiver(receiver, filter); bindService(new Intent(this, MyService.class), connection, BIND_AUTO_CREATE); } @Override protected void onStop() { super.onStop(); unregisterReceiver(receiver); unbindService(connection); } public void calculate(int a, int b) { int result = myService.addNumbers(a, b); myService.sendDataToActivity(result); } } ``` 在xml布局文件中,我们可以添加一个EditText用于输入两个数,并在点击按钮时调用calculate方法进行计算。最后在Manifest文件中添加相关的权限和Service声明。 这样,我们就实现了通过ServiceActivity进行交互的功能。通过bindService方法绑定Service,并使用回调函数接收Service传递的数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值