Hallo zusammen,
ich bin noch ziemlicher Anfänger, doch bevor ich völlig verzweifle, dachte ich schreib ich lieber mal hier rein, vielleicht kann mir ja jemand helfen. Ich möchte per Reflection mehrere Klassen dynamisch laden und soweit klapp das auch. Stecken bleibe ich aber wenn ich meine eigene Klasse, welche eine Subklasse für eine der dynamisch geladenen ist, in einem Funktionsaufruf verwenden möchte. Ohne Reflection sieht der Code so aus:
Watcher.java
Die Klassen "ActivityManagerNative", "IActivityManager" und insbesondere "IActivityController" möchte ich nun aber per Reflection laden. Das ist mein derzeitiger Code:
ActivityWatcher.java hier gehen die @Override Annotiations und das "extend IActivityWatcher.Stub" nicht mehr....
Watcher.java
Kann mir jemand sagen wie ich mit "setActivityController" meine eigene Klasse registriere um, später für bei "activityStarting" aufgerufen werden zu können?
Gruß
yogle
ich bin noch ziemlicher Anfänger, doch bevor ich völlig verzweifle, dachte ich schreib ich lieber mal hier rein, vielleicht kann mir ja jemand helfen. Ich möchte per Reflection mehrere Klassen dynamisch laden und soweit klapp das auch. Stecken bleibe ich aber wenn ich meine eigene Klasse, welche eine Subklasse für eine der dynamisch geladenen ist, in einem Funktionsaufruf verwenden möchte. Ohne Reflection sieht der Code so aus:
Watcher.java
Java:
// Diese drei Klassen möchte ich dynamisch laden!
import com.IActivityController
import com.IActivityManager
import com.ActivityManagerNative
public class Watcher
// Hier ist die wichtige (Sub-)Klassenbezeichnung!
private class ActivityWatcher extends IActivityWatcher.Stub {
@Override
public boolean activityStarting(Intent intent, String pkg) {
System.out.println(intent + " in package " + pkg);
return true;
}
@Override
public boolean activityResuming(String arg0) throws RemoteException {
// TODO Auto-generated method stub
return true;
}
@Override
public boolean appCrashed(String arg0, int arg1, String arg2,
String arg3, byte[] arg4) throws RemoteException {
// TODO Auto-generated method stub
return true;
}
Override
public int appNotResponding(String arg0, int arg1, String arg2)
throws RemoteException {
// TODO Auto-generated method stub
return 0;
}
}
void run() {
IActivityManager aM = ActivityManagerNative.getDefault();
aM.setActivityController(new ActivityWatcher());
}
Die Klassen "ActivityManagerNative", "IActivityManager" und insbesondere "IActivityController" möchte ich nun aber per Reflection laden. Das ist mein derzeitiger Code:
ActivityWatcher.java hier gehen die @Override Annotiations und das "extend IActivityWatcher.Stub" nicht mehr....
Java:
public class ActivityWatcher {
public boolean activityStarting(Intent intent, String pkg) {
System.out.println(intent + " in package " + pkg);
return true;
}
public boolean activityResuming(String arg0) throws RemoteException {
// TODO Auto-generated method stub
return true;
}
public boolean appCrashed(String arg0, int arg1, String arg2,
String arg3, byte[] arg4) throws RemoteException {
// TODO Auto-generated method stub
return true;
}
public int appNotResponding(String arg0, int arg1, String arg2)
throws RemoteException {
// TODO Auto-generated method stub
return 0;
}
}
Watcher.java
Java:
public class Watcher {
void run() {
// Access our class loader
ClassLoader classLoader = Watcher.class.getClassLoader();
try {
Class<?> classIActivityController = classLoader.loadClass("android.app.IActivityController");
System.out.println(classIActivityController.getName());
Class<?> classActivityManagerNative = classLoader.loadClass("android.app.ActivityManagerNative");
System.out.println(classActivityManagerNative.getName());
Class<?> classIActivityManager = classLoader.loadClass("android.app.IActivityManager");
System.out.println(classIActivityManager.getName());
// "ActivityManagerNative.getDefault"
java.lang.Class<?>[] parameterType = null;
Method methGetDefault = classActivityManagerNative.getMethod("getDefault", parameterType);
// "IActivityManager.setActivityController"
Method methSetActivityController = classIActivityManager.getMethod("setActivityController",
classIActivityController);
// Call "ActivityManagerNative.getDefault", function is static -> pass null as instance
java.lang.Object[] argument = null;
Object oIActivityManagerInst = methGetDefault.invoke(null, argument);
// Class<?> subclass = Class.forName("com.systemapp.ActivityWatcher").asSubclass(classIActivityController); <-- Wirft eine ClassCastException
// methSetActivityController.invoke(oIActivityManagerInst, subclass);
} catch(ClassNotFoundException e) {
Log.e("Watcher", "ClassNotFoundException!");
e.printStackTrace();
} catch(NoSuchMethodException e) {
Log.e("Watcher", "NoSuchMethodException!");
e.printStackTrace();
} catch(InvocationTargetException e) {
Log.e("Watcher", "InvocationTargetException!");
e.printStackTrace();
} catch(IllegalAccessException e) {
Log.e("Watcher", "IllegalAccessException!");
e.printStackTrace();
}
}
Kann mir jemand sagen wie ich mit "setActivityController" meine eigene Klasse registriere um, später für bei "activityStarting" aufgerufen werden zu können?
Gruß
yogle