代码之家  ›  专栏  ›  技术社区  ›  efkan

明确的意图不适用于Android 8.1

  •  -1
  • efkan  · 技术社区  · 6 年前

    下面的代码在预OREO版本上没有任何问题。

    尽管我是用户 startForeground 方法和制作 explicit 意图获取活动值, onHandleIntent 从未调用方法。

    我找不到关于这个问题的任何问题或解决方案。

    有没有机会克服这个问题?

    注意:我尝试在我的手机上运行一个自定义的只读存储器,我不能在Android模拟器上模拟这种情况。

    AndroidManifest.xml 文件

    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.myservice"
        android:versionCode="1"
        android:versionName="1.0">
    
        <application ... >
    
          <service android:name="com.MyService">
            <intent-filter>
              <action android:name="com.MyService"/>
            </intent-filter>
          </service>
    
          <uses-permission android:name="com.google.android.gms.permission.ACTIVITY_RECOGNITION" />
    
          <service android:name="com.myservice.ActivityHelper$ActivityRecognitionService" />
    
        </application>
    
    </manifest>
    

    MyService.java 文件

    public class MyService extends Service {
    
        ...
    
        @Override
        public int onStartCommand(Intent intent, int flags, int startId) {
            super.onStartCommand(intent, flags, startId);
    
            runServiceAtForeground();
    
            return START_STICKY;
        }
    
    
        private void runServiceAtForeground () {
            ...
    
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                ...
                mNotificationManager.createNotificationChannel(channel);
            }
    
            Intent i = new Intent(getApplicationContext(), MyService.class);
            PendingIntent pi = PendingIntent.getActivity(this, 0, i, 0);
            NotificationCompat.Builder notif = new NotificationCompat.Builder(this, channel_id);
            notif.setContentIntent(pi);
    
            // MAKING FOREGROUND SERVICE
            startForeground(notif_id, notif.build());
    
            // STARTING ACTIVITY RECOGNITION
            mActivityHelper.startObserving();
    
        }
    
        ...
    
    }
    

    ActivityHelper.java 文件

    public class ActivityHelper {
    
        ...
    
        public void startObserving() {
            ActivityRecognitionClient arc = ActivityRecognition.getClient(context);
    
            Task<Void> task = arc.requestActivityUpdates(20000, getActivityDetectionPendingIntent());
    
            task.addOnSuccessListener(new OnSuccessListener<Void>() {...});
    
            task.addOnFailureListener(new OnFailureListener() {...});
        }
    
        private PendingIntent getActivityDetectionPendingIntent() {
                Intent i = new Intent(mContext, ActivityRecognitionService.class);
    
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                    return PendingIntent.getBroadcast(mContext, 0, i, PendingIntent.FLAG_UPDATE_CURRENT);
                } else {
                    return PendingIntent.getService(mContext, 0, i, PendingIntent.FLAG_UPDATE_CURRENT);
                }
        }
    
    
        public static class ActivityRecognitionService extends IntentService {
    
            public ActivityRecognitionService() {
                super("ActivityRecognitionService");
            }
    
            @Override
            public void onCreate() {
                super.onCreate();
            }
    
            @Override
            protected void onHandleIntent(Intent intent) {
    
                // THIS METHOD IS NEVER RUN ON OREO
    
                if (ActivityRecognitionResult.hasResult(intent)) {
                    ActivityRecognitionResult result = ActivityRecognitionResult.extractResult(intent);
    
                    if (listener != null) {
                        Log.v(TAG, result.getMostProbableActivity().getType());
                    }
    
                    stopSelf();
                }
            }
    
        }
    
    }
    
    1 回复  |  直到 6 年前
        1
  •  0
  •   CommonsWare    6 年前
    private PendingIntent getActivityDetectionPendingIntent() {
            Intent i = new Intent(mContext, ActivityRecognitionService.class);
    
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                return PendingIntent.getBroadcast(mContext, 0, i, PendingIntent.FLAG_UPDATE_CURRENT);
            } else {
                return PendingIntent.getService(mContext, 0, i, PendingIntent.FLAG_UPDATE_CURRENT);
            }
    }
    

    要么 ActivityRecognitionService 是一个 BroadcastReceiver 它是一个 Service . 两者不能同时存在。这不会因设备运行的操作系统版本而改变。从那以后 ActivityRecognitionService extends IntentService , PendingIntent.getBroadcast() 不会给你一个有用的 PendingIntent .

    也:

    • MyService 未使用,因为它不在清单代码段中,并且未从其他代码段引用。

    • 这个 runServiceAtForeground() 方法 我的服务 创建活动 处理意图 指向 我的服务 但是 我的服务 不是活动,因此这不起作用