я использую DexClassLoader динамически загрузить Android Service
класса от внешнего Dex файла в onCreate()
обратного вызова MyActivity
:Начало службы (по классу) возвращает нуль в моем случае
public class MyActivity extends Activity {
private Class<Object> myServiceClass;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
String dexFile = "path/to/dexFile.dex";
DexClassLoader classLoader = new DexClassLoader(dexFile, getDir("tmp", 0).getAbsolutePath(), null, this.getClass().getClassLoader());
myServiceClass = (Class<Object>) classloader.loadClass("com.test.MyService");
//Here, I am able to use java relfection to successfully get those methods in myServiceClass.
//so, no problem here!
}
@Override
protected void onStart() {
super.onStart();
//PROBLEM HERE: I get null, failed to start service, why?
ComponentName name = startService(new Intent(this, myServiceClass.getClass()));
}
Я также объявил MyService в AndroidManifest.xml.
<service
android:name="com.test.MyService"
/>
Почему я получаю нулевой, когда начать свою службу в onStart()
обратного вызова MyActivity
?
================ Update (StartService() возвращает имя компонента в настоящее время) ==========
После того как я изменил использовать ComponentName name = startService(new Intent(this, myServiceClass));
выше startService(...)
возвращает мне следующее имя компонента:
ComponentInfo{com.project.myapp/com.test.MyService}
Но мой LogCat также показать мне ошибки:
No content provider found for permission revoke: file:///data/local/tmp/myapp.apk
...
Unable to start service Intent { cmp=com.project.myapp/java.lang.Class }: not found
...
...
java.lang.RuntimeException: Unable to instantiate service com.test.MyService: java.lang.ClassNotFoundException: com.test.MyService
12-23 13:50:44.040: E/AndroidRuntime(7959): at android.app.ActivityThread.handleCreateService(ActivityThread.java:2380)
12-23 13:50:44.040: E/AndroidRuntime(7959): at android.app.ActivityThread.access$1600(ActivityThread.java:138)
12-23 13:50:44.040: E/AndroidRuntime(7959): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1286)
«Этот классный загрузчик требует приложения, доступного для записи, каталога ...», что такое «путь/to/dexFile.dex»? Также любые конкретные ошибки или следы? Можете ли вы добавить вызовы журнала в методы [lifecycle] (http://developer.android.com/reference/android/app/Service.html#ServiceLifecycle), чтобы узнать, какой из них вызывается? Включите его и в конструктор, посмотрите, насколько он загружается и где он останавливается. – soulseekah
Привет, «путь/to/dexFile.dex» находится в моем каталоге sdcard. Я также получил сообщение об ошибке «Не предоставление разрешения android.permission.READ_LOGS» – Mellon
sdcard не является закрытым приложением. Попробуйте getDir для него частный каталог, аналогичный тому, как вы для него 'tmp'. – soulseekah