Activity oder View aus Service heraus starten und über andere App anzeigen

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Activity oder View aus Service heraus starten und über andere App anzeigen

    Hallo,

    ///EDIT
    Irgendwie zerhauts mir grad ständig den Code...wenn mir jemand auch kurz sagen kann woran das liegt versuch ich es besser dazustellen.

    //URSPRÜNGLICHER THREAD
    ich habe vor kurzem mit dem Entwickeln von Android Applikationen angefangen. Das Prinzip habe ich verstanden bin aber jetzt auf ein Problem gestoßen.

    Ich möchte eine App entwickeln welche einen Service startet der immer wieder überprüft ob ein bestimmter Zustand eintritt. In dem Fall jetzt wenn eine bestimmte andere App gestartet ist. Ich habe jetzt versucht eine Activity zu starten aber auch schon einfach eine View mittels WindowManager. Die View ließ sich bisher nur anzeigen wenn meine eigene App am laufen war. Starte ich eine andere app und der service registriert das, erscheint die View nicht. Dass es möglich ist hab eich mehrfach gelesen bzw. der facebook messenger macht das ja bereits vor.

    Ich würde gerne wissen wo ich einen Fehler gemacht habe. Fehlermeldungen sind in der Log keine aufgetreten. Im folgenden mein Code in Auszügen um nachzuvollziehen wie ich da herangegangen bin.



    MainActivity meiner app

    Quellcode

    1. public class MainActivity extends Activity {
    2. protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); }setContentView(R.layout.activity_main); }
    3. public void sendMessage(){ Intent i = new Intent(this, SilentStudyService.class); this.startService(i); } }



    Der aufgerufene Service:

    Quellcode

    1. public class SilentStudyService extends IntentService { //Timer Object anlegen private Timer t=new Timer(); public SilentStudyService() { super("SilentStudyServiceName"); // TODO Auto-generated constructor stub }
    2. public void onCreate(){ super.onCreate(); } @Override public IBinder onBind(Intent arg0) { // TODO Auto-generated method stub return null; } public void finishService(){ stopSelf(); }
    3. @Override protected void onHandleIntent(Intent intent) { //Zeitliches ausführen des Checks SilentStudyExecutionCheck timedTask = new SilentStudyExecutionCheck(((ActivityManager)getSystemService("activity")), this); t.schedule(timedTask,0,1000); } //Methode welche die Activity bzw. View über der anderen App anzeigen soll public void startBlockActivity(){ Intent i = new Intent(this, SilentStudyBlocker2.class); i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); i.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); startService(i); }
    4. }




    Das ist die Klasse welche immer wieder prüft ob eine bestimmte App gestartet ist. In diesem Fall ich hab ich jetzt einfach mal Whatsapp hart rein kodiert. Das dient mir jetzt nur als beispiel. In dieser Klasse wird dann auch die "startBlockActivity()" Methode aus dem Service gestartet.

    Das hier wäre die Klasse:

    Quellcode

    1. public class SilentStudyExecutionCheck extends TimerTask { //zähler für erscheinung einer App private static int counter = 0; //zwischenspeicher für aufgerufene Apps private static String prevAppName = ""; //Aufrufender Service SilentStudyService service; private ActivityManager activityManager; public SilentStudyExecutionCheck(ActivityManager manager, SilentStudyService service){ this.activityManager = manager; this.service = service; }
    2. @Override public void run() { //Abrufen der aktuell laufenden App List <ActivityManager.RunningTaskInfo> list = this.activityManager.getRunningTasks(1); ActivityManager.RunningTaskInfo task = list.get(0); String taskName = task.topActivity.getPackageName(); if(taskName.equals("com.whatsapp") && !taskName.equals(SilentStudyExecutionCheck.prevAppName)){ //Aufruf der Methode welche die Activity bzw. View startet. this.service.startBlockActivity(); SilentStudyExecutionCheck.counter++; } SilentStudyExecutionCheck.prevAppName = taskName; } }




    Ich habe jetzt immer von Activity oder View geredet. Ich habe beides ausprobiert mit dem selben Ergebnis. Hier wäre die Klasse welche den View anzeigen würde. Ich vermute mein Fehler liegt irgendwo hier:

    Quellcode

    1. public class SilentStudyBlocker extends IntentService {
    2. private WindowManager windowManager; private ImageView chatHead; public SilentStudyBlocker() { super("SilentStudyBlocker"); // TODO Auto-generated constructor stub }
    3. @Override protected void onHandleIntent(Intent intent) { // TODO Auto-generated method stub windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
    4. chatHead = new ImageView(this); chatHead.setImageResource(R.drawable.ic_launcher);
    5. /* WindowManager.LayoutParams params = new WindowManager.LayoutParams( WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY, 0, PixelFormat.TRANSLUCENT);*/ WindowManager.LayoutParams params = new WindowManager.LayoutParams( WindowManager.LayoutParams.TYPE_SYSTEM_ERROR, WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL | WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH, PixelFormat.TRANSLUCENT);
    6. params.gravity = Gravity.TOP | Gravity.RIGHT; //params.x = 0; //params.y = 100; params.setTitle("Load Average");
    7. windowManager.addView(chatHead, params); }
    8. }



    Die Activity Klasse lasse ich mal weg, da diese nichts außer den von Eclipse generierten Code enthält.

    Ich hoffe ich konnte es klar darstellen was ich vorhabe und wo mein Problem liegt. Falls noch irgendwelche Infos wie das AndroidManifest etc. benötigt werden sagt mir Bescheid :)

    Vielen Dank schon mal!
    Vangoo