3

У меня есть служба. Я использовал WindowManager для отображения некоторого пользовательского интерфейса во время выполнения службы. Также я показываю уведомление в течение всего срока службы этой Службы.Служба с WindowManager и уведомлением

Ниже мой класс Сервис

public class DemoService extends Service implements View.OnClickListener { 

private static final int mLayoutParamFlags = WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH 
     | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL; 

// Views 
private View mDemoView; 
private ImageButton mEndButton 

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 

    showNotification(); 

    return START_STICKY; 
} 

@Override 
public void onCreate() { 
    super.onCreate(); 

    LayoutInflater layoutInflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE); 
    mDemoView = layoutInflater.inflate(R.layout.windowmanager_demo, null); 

    WindowManager.LayoutParams params = new WindowManager.LayoutParams(
      WindowManager.LayoutParams.MATCH_PARENT, 
      WindowManager.LayoutParams.MATCH_PARENT, 
      WindowManager.LayoutParams.TYPE_SYSTEM_ALERT, 
      mLayoutParamFlags, 
      PixelFormat.TRANSLUCENT); 

    mEndButton = (Button) view.findViewById(R.id.end_button); 
    mEndButton.setOnClickListener(this); 

    WindowManager windowManager = (WindowManager) getSystemService(WINDOW_SERVICE); 
    windowManager.addView(mDemoView, params); 
} 

@Override 
public void onDestroy() { 
    super.onDestroy(); 
    // Remove notification 
    stopForeground(true); 
    // Remove WindowManager 
    if(mDemoView != null){ 
     WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE); 
     wm.removeView(mDemoView); 
    } 
} 

@Nullable 
@Override 
public IBinder onBind(Intent intent) { 
    return null; 
} 

@Override 
public void onClick(View view) { 
    switch (view.getId()) { 
     case R.id.end_button: 
      endService(); 
      break; 
    } 
} 

/** 
* Show notification 
*/ 
private void showNotification() { 
    NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(getApplicationContext()) 
      .setSmallIcon(R.mipmap.demoicon) 
      .setContentTitle("Demo App") 
      .setContentText("Demo Message"); 

    startForeground(R.string.demo_string, notificationBuilder.build()); 
} 

private void endService() { 
    // Stop demo service 
    stopSelf(); 
} 

Ниже перечислены вещи, которые я хочу реализовать, но я не знаю, как

  1. Когда служба запущена и UI WindowManager в отображается, если я нажимаю аппаратный задний/домашний ключ, тогда пользовательский интерфейс WindowManager должен исчезнуть, пока служба должна продолжать работать. Я не знаю, как захватить пресс-службу.

  2. Когда я нажимаю на уведомление, пользовательский интерфейс WindowManager должен стать видимым.

Пожалуйста, помогите мне реализовать эти 2 вещи.

ответ

2
  1. Чтобы поймать ключ обратно, продлить ViewGroup или View вы добавляете к WindowManager, и переопределить onKeyUp или dispatchKeyEvent (и проверить KEYCODE и отслеживать ACTION_UP). Обратите внимание, что для обеспечения его работоспособности вы должны проверить свои флаги LayoutParams и его тип, чтобы ваш объект был сфокусирован (например, с TYPE_SYSTEM_OVERLAY, окно не фокусируется), BUT, когда ваш просмотр рухнул (если вы делаете что-то вроде Facebook Messenger Chat Heads), вы должны обновить View LayoutParams, чтобы поставить флаг FLAG_NOT_FOCUSABLE. Если вы этого не сделаете, нажатие клавиши «Назад» не будет отправлено в основное действие, но только в ваше окно, что позволит пользователям удалить ваше приложение.
  2. При добавлении действия к уведомлению вы используете PendingIntent. В ожидании, вы можете добавить явное намерение. Это может быть действие службы (не беспокойтесь, ваш сервис не может быть запущен дважды, только onStartCommand будет вызываться в запущенном экземпляре, если он уже запущен), BroadcastReceiver или Activity. Действия служб - это то, что вы, вероятно, хотите, но вы также можете использовать BroadcastReceivers, если это необходимо.

Обратите внимание, что Marshmallow требует, чтобы вы вывели пользователя на экран настроек, чтобы позволить ему вручную разрешить разрешение «Нарисуйте другие приложения» для вашего приложения. Вы можете найти более подробную информацию о Android Developers page on G+, они недавно опубликовали разрешения на выполнение.