请问android app如何启动DexClassLoader动态加载的jar包中定义的service
架构需求就是这样,Service类定义在一个Jar包插件,通过网络下载或者push到SD卡中,然后要求Service在新进程中启动。
运行时出现找不到Service类的错误,然后程序错误崩溃:
Caused by: java.lang.ClassNotFoundException: Didn't find class JarService
贴个简单代码示例吧
主Activity就是load SD卡上的jar包,反射获取类名,intent启动service
public class MainActivity extends ActionBarActivity {
private final String TAG = "MainActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.i(TAG, "onCreate");
ClassLoader dexLoader = new DexClassLoader("/sdcard/jarservicetest.jar", getCacheDir().getAbsolutePath(), null, getClassLoader());
//ClassLoader dexLoader = getClassLoader();
try {
Log.i(TAG, "try");
Class<?> activityClass = dexLoader.loadClass("com.example.jarservicetest.JarService");
Intent intent = new Intent(this, activityClass);
startService(intent);
} catch (ClassNotFoundException e) {
Log.i(TAG, "catch");
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
Service就一空壳
public class JarService extends Service{
private final String TAG = "JARSERVICE";
@Override
public void onCreate() {
// TODO Auto-generated method stub
Log.i(TAG, "onCreate");
super.onCreate();
}
@Override
public void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
}
@Override
public IBinder onBind(Intent arg0) {
// TODO Auto-generated method stub
return null;
}
}
Manifest文件中声明了Service
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<service android:name="com.example.jarservicetest.JarService" >
<!-- android:process=":process1"> -->
</service>
请教达人们,面对这种需求,有啥解决办法?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
jarservicetest.jar
文件里包含的是class文件还是dex文件Environment.getExternalStorageDirectory()
这个其实找不到是正常的,加载的时候用户发出Intent,系统启动Service,你的Service在别的apk或者jar里边使用dexclassloader中的Service是在系统里边注册过也找不到,也就是说,需要自己手动加载,但是加载时机是不清楚的,因为并不知道Intent何时出发,目前只知道actitivy和Broadcast(静态注册,动态注册不必考虑动态加载)可以使用动态加载,service和contentprovider这两个还不知道如何加载,不过可以绕过去,在使用service得地方换成Broadcast通知主包,主包手动加载service。如果有大神知道如何动态加载service,可以与我交换经验~~哈哈哈