Я пытаюсь ознакомиться с андроидом 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 (...): и создание тоста там тоже не сработало.
Я использую AIDE и создаю его прямо с телефона для удобства. Я не думаю, что точки останова на этом. Как подключить TouchEventListener к ViewGroup? – REGAL
Я имел в виду OnTouchListener (исправлено выше). Просто создайте новый и подключитесь к ViewGroup.setOnTouchListener. Не забудьте фильтровать события по типу, иначе вы получите 2 вызова, один раз при касании и один на конце. –
О, onTouchListener. Это разъясняет вещи – REGAL