2015-02-20 3 views
1

Я пытаюсь ознакомиться с андроидом Service, с целью наложения экрана и рисования на него/взаимодействия с пользователем за пределами приложения.Является ли моя служба работоспособной?

Я знаю, что службы не предназначены для взаимодействия с пользователем, но я не могу найти другой способ этого.

Я нашел несколько ресурсов, которые были довольно полезны here на переполнение стека. Here - еще один проект GitHub, который является примером чего-то подобного, но по-другому.

Как раз сейчас, только потому, что я учусь и хочу выполнить эту конкретную бесполезную вещь, я хочу, чтобы каждый раз, когда экран был затронут, он должен быть Toast.

От чтения и поиска, я понимаю, что мне нужно начать Intent услуги. Я должен использовать эту услугу, чтобы добавить ViewGroup в WindowManager. Обработка касаний и то, что рисуется на экране, обрабатывается в ViewGroup.

Да, у меня есть службы и наложения разрешения должным образом размещены в AndroidManifest.xml

Вот мои 3 класса

public class MainActivity extends Activity 
{ 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     startService(new Intent(this, MyService.class)); 
     finish(); 
    } 

} 

public class MyService extends Service 
{ 

    @Override 
    public IBinder onBind(Intent p1) 
    { 
     // TODO: Implement this method 
     return null; 
    } 

    private MyView view; 
    @Override 
    public void onCreate() 
    { 
     // TODO: Implement this method 
     super.onCreate(); 
     view = new MyView(this); 
     WindowManager.LayoutParams params = new WindowManager.LayoutParams(
      WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY, 
      WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH, 
      PixelFormat.TRANSLUCENT); 
     params.gravity = Gravity.RIGHT | Gravity.TOP; 
     params.setTitle("Load Average"); 
     WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE); 
     wm.addView(view, params); 
    } 

} 

public class MyView extends ViewGroup 
{ 

    public MyView(Context context){ 
     super(context); 
     setLayoutParams(new LayoutParams(
       ViewGroup.LayoutParams.MATCH_PARENT, 
       ViewGroup.LayoutParams.MATCH_PARENT)); 


    } 

    @Override 
    protected void onDraw(Canvas canvas) { 
     super.onDraw(canvas); 
    } 


    @Override 
    protected void onLayout(boolean p1, int p2, int p3, int p4, int p5) 
    { 
     // TODO: Implement this method 
    } 

    @Override 
    public boolean onTouchEvent(MotionEvent event) 
    { 
     // TODO: Implement this method 
     Toast.makeText(getContext(), "Touched", Toast.LENGTH_SHORT).show(); 
     return true; 
    } 

} 

Этот код компилируется и запускается без ошибок, а во время беспорядка с этим я могу нарисовать вещи на экране в методе рисования, но тост в onTouchEvent никогда не появляется на экране. Почему он не появится?

Редактировать: Использование setOnTouchListener (...): и создание тоста там тоже не сработало.

ответ

0

Создание и нанесение ваших услуг в порядке, как и ваш тост-код. Выбросьте точку останова на Toast.makeText() и посмотрите, не вызвана ли она. Мое подозрение в том, что это не так.

Попробуйте создать OnTouchListener и привязать его к ViewGroup, вместо того, чтобы использовать OnTouchEvent. Это работало для меня в прошлом.

Редактировать: Исправлено до OnTouchListner.

+0

Я использую AIDE и создаю его прямо с телефона для удобства. Я не думаю, что точки останова на этом. Как подключить TouchEventListener к ViewGroup? – REGAL

+0

Я имел в виду OnTouchListener (исправлено выше). Просто создайте новый и подключитесь к ViewGroup.setOnTouchListener. Не забудьте фильтровать события по типу, иначе вы получите 2 вызова, один раз при касании и один на конце. –

+0

О, onTouchListener. Это разъясняет вещи – REGAL