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

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



    Der aufgerufene Service:


    Code
    public class SilentStudyService extends IntentService {			//Timer Object anlegen	private Timer t=new Timer();		public SilentStudyService() {		super("SilentStudyServiceName");		// TODO Auto-generated constructor stub	}
    	public void onCreate(){				super.onCreate();	}		@Override	public IBinder onBind(Intent arg0) {		// TODO Auto-generated method stub		return null;	}		public void finishService(){		stopSelf();	}
    	@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);	}	
    }




    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:


    Code
    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;	}	
    		@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:


    Code
    public class SilentStudyBlocker extends IntentService {
    		private WindowManager windowManager;	private ImageView chatHead;		public SilentStudyBlocker() {		super("SilentStudyBlocker");		// TODO Auto-generated constructor stub	}
    	@Override	protected void onHandleIntent(Intent intent) {		// TODO Auto-generated method stub		windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
    	    chatHead = new ImageView(this);	    chatHead.setImageResource(R.drawable.ic_launcher);
    	   /* 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);
    	    params.gravity = Gravity.TOP | Gravity.RIGHT;	    //params.x = 0;	    //params.y = 100;	    params.setTitle("Load Average");
    	    windowManager.addView(chatHead, params);	}
    }



    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

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!