【问题标题】:How do I implement background service for kontakt.io sdk?如何为 kontakt.io sdk 实现后台服务?
【发布时间】:2015-01-22 12:32:21
【问题描述】:

如果我使用 Android 设备进入信标区域,我希望显示通知。 Android SDK Quickstart

只要应用程序处于活动状态,它就可以正常工作。 如何在应用关闭时收到通知?

【问题讨论】:

    标签: android ibeacon ibeacon-android android-ibeacon


    【解决方案1】:

    我自己建立一个服务:

    BeaconRangingService.java

        public class BeaconRangingService extends Service {
    
            private static final String TAG = BeaconRangingService.class.getSimpleName();
            private BeaconManager beaconManager;
    
            @Override
            public void onCreate() {
                super.onCreate();
                beaconManager = BeaconManager.newInstance(getApplicationContext());
                beaconManager.setMonitorPeriod(MonitorPeriod.MINIMAL);
                beaconManager.setForceScanConfiguration(ForceScanConfiguration.DEFAULT);
                beaconManager.registerMonitoringListener(new BeaconManager.MonitoringListener() {
                    @Override
                    public void onMonitorStart() {
                        Log.v(TAG, "start monitoring beacons");
                    }
    
                    @Override
                    public void onMonitorStop() {
                        Log.wtf(TAG, "stop monitoring beacons");
                    }
    
                    @Override
                    public void onBeaconsUpdated(Region region, List<Beacon> list) {
    
                    }
    
                    @Override
                    public void onBeaconAppeared(Region region, Beacon beacon) {
                       Toast.makeText(getApplicationContext(), "Beacon appeared\n BEACON ID: " + beacon.getBeaconUniqueId(), Toast.LENGTH_SHORT).show();
                    }
    
                    @Override
                    public void onRegionEntered(Region region) {
    
                    }
    
                    @Override
                    public void onRegionAbandoned(Region region) {
    
                    }
                });
    
            }
    
            @Override
            public int onStartCommand(Intent intent, int flags, int startId) {
    
                Log.v(TAG, "service started");
    
                if (!beaconManager.isBluetoothEnabled()) {
                    Log.w(TAG, "bluetooth disabled, stop service");
                    stopSelf();
                } else {
                    connect();
                }
    
                return super.onStartCommand(intent, flags, startId);
            }
    
            @Override
            public IBinder onBind(Intent intent) {
                return null;
            }
    
            @Override
            public void onDestroy() {
                Log.v(TAG, "service destroyed");
                beaconManager.stopMonitoring();
                beaconManager.disconnect();
                beaconManager = null;
                super.onDestroy();
            }
    
            private void connectBeaconManager() {
                try {
                    beaconManager.connect(new OnServiceBoundListener() {
                        @Override
                        public void onServiceBound() {
                            try {
                                HashSet<Region> regions = new HashSet<>();
                                regions.add(Region.EVERYWHERE);
                                beaconManager.startMonitoring(regions);
                            } catch (RemoteException e) {
                                e.printStackTrace();
                            }
                        }
                    });
                } catch (RemoteException e) {
                    throw new IllegalStateException(e);
                }
            }
    
        }     
    

    AndroidManifest.xml

     <service
                android:name="com.your.package.BeaconRangingService"
                android:exported="false"/>
    

    启动服务

     Intent intent = new Intent(this, BeaconRangingService.class);
     startService(intent);
    

    【讨论】:

    • 抱歉,您还记得如何使用此代码吗?我没有收到使用它的通知。当我的 Activity 进入 onPause() 时,我尝试调用意图,但它不起作用..
    • 你好。我也没有通过使用此代码获得任何日志,您可以分享一些示例吗?
    • 我认为在上面的代码中没有调用通知。所以,你应该在 'onBeaconAppeared' 方法中调用它。
    【解决方案2】:

    我对 kontakt.io 一无所知,但有一个用于 AltBeacon 的库和参考应用程序,它提供了此功能。 https://github.com/AltBeacon

    我相信这是通用的 Android 功能,而不是它们的实现有什么神奇之处。

    【讨论】:

    • 感谢您的提示。但我绝对必须使用来自kontakt.io 的库。我们还从他们那里购买了信标。
    • @erdna altbeacon 不会阻止您使用 kontakt.io 信标。它只是不提供修改其信标的方法。顺便说一句,我认为这两个库都没有正确处理后台监控。在 Android 上始终运行的服务在 99% 的情况下都是个坏主意。
    【解决方案3】:

    @erdna 你测试过示例 kontakt 管理应用程序吗?有一种方法,当应用程序在前台运行时出现 Toast,而当应用程序在后台运行时出现标准通知。

    https://github.com/kontaktio/kontakt-beacon-admin-sample-app

    【讨论】:

    • 是的.. 但是示例使用的是绑定服务。对于已启动的服务,它不起作用。
    【解决方案4】:

    @erdna 我猜它应该是IntentService 用于长时间运行的服务,它将传入的信标事件作为onHandleIntent(Intent intent) 方法中的意图进行监控。 @dawid-gdanski 我不确定你指的是哪个类。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-27
      • 2019-11-06
      相关资源
      最近更新 更多