zoukankan      html  css  js  c++  java
  • Activity 与 Service 之间的消息传递

    BgService代码

    public class BgService extends Service {
        public static final String TAG = "BgService";
        private BgBinder binder;
    
        @Override
        public void onCreate() {
            super.onCreate();
            binder = new BgBinder();
            Log.d(TAG, "onCreate() executed");
        }
    
        @Override
        public void onDestroy() {
            super.onDestroy();
            Log.d(TAG, "onDestroy() executed");
        }
    
        @Override
        public int onStartCommand(Intent intent, int flags, int startId) {
            Log.d(TAG, "onStartCommand() executed");
            return super.onStartCommand(intent, flags, startId);
        }
    
        @Nullable
        @Override
        public IBinder onBind(Intent intent) {
            Log.d(TAG, "onBind() executed");
            return binder;
        }
    
        class BgBinder extends Binder {
            public void doWork() {
                Log.d(TAG, "doWork() executed");
            }
        }
    }

    Activity 代码

    public class MyActivity extends AppCompatActivity {
        private ServiceConnection bgServiceConnection;
        private BgService.BgBinder bgBinder;
        
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            ...
            bgServiceConnection = new ServiceConnection() {
                @Override
                public void onServiceConnected(ComponentName name, IBinder service) {
                    bgBinder = (BgService.BgBinder)service;
                    bgBinder.doWork(); // 异步回调必须在这里调用
                    Log.d("MyActivity", "onServiceConnected");
                }
    
                @Override
                public void onServiceDisconnected(ComponentName name) {
                    bgBinder = null;
                    Log.d("MyActivity", "onServiceDisconnected");
                }
            };
            ...
        }
    
        public void startBg(View view) {
            Intent intent = new Intent(this, BgService.class);
            startService(intent);
        }
    
        public void stopBg(View view) {
            Intent intent = new Intent(this, BgService.class);
            stopService(intent);
        }
    
        public void bindBg(View view) {
            Intent intent = new Intent(this, BgService.class);
            bindService(intent, bgServiceConnection, BIND_AUTO_CREATE);
        }
    
        public void unbindBg(View view) {
            unbindService(bgServiceConnection);
        }
    }


    其中
    startService 调用onStartCommand, 如果service未create, 会在调用之前, 调用onCreate
    stopService 会检查service被引用的情况, 如果没有其他引用, 则调用onDestroy

    bindService 会调用onBind(之后在异步返回中执行onServiceConnected), 如果service未create, 会在调用之前, 调用onCreate. 注意, 不会调用onStartCommand
    unbindService 会检查service被引用的情况, 如果没有其他引用, 则调用onDestroy,

    unbindService与stopService的区别: stopService可多次调用, 不会抛异常, unbindService在执行后如果再调用会抛异常, 不处理则应用崩溃

    onServiceDisconnected为什么没被调用? 这个只有在service因异常而断开连接的时候,这个方法才会被调用 This is called when the connection with the service has been unexpectedly disconnected -- that is, its process crashed. Because it is running in our same process, we should never see this happen.



  • 相关阅读:
    [LeetCode]2. Add Two Numbers链表相加
    Integration between Dynamics 365 and Dynamics 365 Finance and Operation
    向视图列添加自定义图标和提示信息 -- PowerApps / Dynamics365
    Update the Power Apps portals solution
    Migrate portal configuration
    Use variable to setup related components visible
    Loyalty management on Retail of Dynamic 365
    Modern Fluent UI controls in Power Apps
    Change screen size and orientation of a canvas app in Power App
    Communication Plan for Power Platform
  • 原文地址:https://www.cnblogs.com/milton/p/5463352.html
Copyright © 2011-2022 走看看