Recyclerview в сервисе - PullRequest
       2

Recyclerview в сервисе

0 голосов
/ 14 октября 2018

Модал

public class Helper {
private String a;
private String b;
private String c;
private long d;
private long e;

public Helper() {
}

public Helper(String a, String b, String c, long d, long e) {
    this.a= a;
    this.b= b;
    this.c= c;
    this.d = d;
    this.e= e;
}

public String geta() {
    return a;
}

public void seta(String a) {
    this.a= a;
}

public String getb() {
    return b;
}

public void setb(String b) {
    this.b= b;
}

public String getc() {
    return c;
}

public void setce(String c) {
    this.c = c;
}

public long isd() {
    return d;
}

public void setd(long d) {
    this.d= d;
}

public long gete() {
    return e;
}

public void sete(long e) {
    this.e= e;
}

}

Сервис

public class PieOptions  extends Service {
WindowManager wm;
RelativeLayout ll;
LayoutInflater li;

@Override
public IBinder onBind(Intent intent) {
    // TODO Auto-generated method stub
    return null;
}

@Override
public void onCreate() {
    // TODO Auto-generated method stub
    super.onCreate();
    final View myview;
    li = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
    wm = (WindowManager) getSystemService(WINDOW_SERVICE);
    myview = li.inflate(R.layout.service_pie, null);

    ImageButton mClose = (ImageButton) myview.findViewById(R.id.close);


    WindowManager.LayoutParams params = new WindowManager.LayoutParams(
            WindowManager.LayoutParams.TYPE_INPUT_METHOD |
                    WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY,// | WindowManager.LayoutParams.TYPE_SYSTEM_ALERT,
            WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL,
            PixelFormat.TRANSLUCENT);

    /////////////////////////Another params


    params = new WindowManager.LayoutParams(
            750,1250,
            WindowManager.LayoutParams.TYPE_PHONE,
            WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
            PixelFormat.TRANSLUCENT);

    params.gravity = Gravity.CENTER | Gravity.CENTER;

    wm.addView(myview, params);
    params.x = 0;
    params.y = 0;

    final WindowManager.LayoutParams finalParameters = params;

    mClose.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            wm.removeView(myview);
            stopSelf();
        }
    });
}

@Override
public void onDestroy() {
    super.onDestroy();
    stopSelf();
}

Я очень много продвинулся.Может кто-нибудь, пожалуйста, помогите мне продолжить.Я хочу получить данные из Firebase и показать их в этом обзоре внутри службы.В Google очень мало информации об услугах и раздутии макета, поэтому я не совсем понимаю, как это сделать, поэтому кто-нибудь может помочь с кодом.Заранее спасибо

1 Ответ

0 голосов
/ 14 октября 2018

Во-первых, если вы работаете в API> = 26, вам нужно использовать службы переднего плана, используйте следующий код для запуска службы

Intent intent = new Intent(getApplicationContext(), PieOptions.class);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            startForegroundService(intent);
        }else {
            startService(intent);
        }

Теперь внутри вас PieOptions класс, сначала расширьтеJobIntentService вместо Service, в методе onCreate() добавьте следующий код.Службы Foreground должны показывать пользователю уведомление об API> = 26, в противном случае служба будет уничтожена через 5 секунд.

   @Override
    public void onCreate() {
        super.onCreate();
        String CHANNEL_ID = "my_service";
        String CHANNEL_NAME = "My Background Service";
        if (Build.VERSION.SDK_INT >= 26) {
            // in APIs 26+ we should show a notifications
            NotificationChannel channel = new NotificationChannel(CHANNEL_ID,
                    CHANNEL_NAME, NotificationManager.IMPORTANCE_NONE);
            ((NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE)).createNotificationChannel(channel);

            Notification notification = new NotificationCompat.Builder(this, CHANNEL_ID)
                    .setCategory(Notification.CATEGORY_SERVICE).setPriority(PRIORITY_MIN).build();

            startForeground(NOTIFICATION_ID, notification);
        }

}

Еще одна вещь, которую вам нужно сделать, это изменить тип, который вы используете при инициализации параметров макета, следующий код даст вам правильный тип в зависимости от вашей версии API

int type = 0;
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT;
        }
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            type = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;
        }
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
            type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT;
        }

И последнее: чтобы рисовать оверлеи, необходимо убедиться, что у вас есть разрешение на рисование оверлеев:

private boolean canDrawOnScreen() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        return canDrawOnScreenM();
    } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
        return canDrawOverlaysUsingReflection(getApplicationContext());
    } else
        return true;
}

@RequiresApi(api = Build.VERSION_CODES.M)
private boolean canDrawOnScreenM() {
    return Settings.canDrawOverlays(getApplicationContext());
}


@RequiresApi(api = Build.VERSION_CODES.KITKAT)
public static boolean canDrawOverlaysUsingReflection(Context context) {
    try {
        AppOpsManager manager = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE);
        Class clazz = AppOpsManager.class;
        Method dispatchMethod = clazz.getMethod("checkOp", new Class[]{int.class, int.class, String.class});
        //AppOpsManager.OP_SYSTEM_ALERT_WINDOW = 24
        int mode = (Integer) dispatchMethod.invoke(manager, new Object[]{24, Binder.getCallingUid(), context.getApplicationContext().getPackageName()});
        return AppOpsManager.MODE_ALLOWED == mode;
    } catch (Exception e) {
        return false;
    }

}

Теперь для надуваемой части и обработки представления переработчика, сначала вам нужна ссылка на представление переработчика,вы можете сделать следующее:

                RecyclerView myRecyclerView = mView.findViewById(R.id.your_recycler_id);

, затем вы можете обработать RecyclerView в обычном режиме, настроив менеджер раскладки и адаптер.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...