首页 > 请问android app如何启动DexClassLoader动态加载的jar包中定义的service

请问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>

请教达人们,面对这种需求,有啥解决办法?



这个其实找不到是正常的,加载的时候用户发出Intent,系统启动Service,你的Service在别的apk或者jar里边使用dexclassloader中的Service是在系统里边注册过也找不到,也就是说,需要自己手动加载,但是加载时机是不清楚的,因为并不知道Intent何时出发,目前只知道actitivy和Broadcast(静态注册,动态注册不必考虑动态加载)可以使用动态加载,service和contentprovider这两个还不知道如何加载,不过可以绕过去,在使用service得地方换成Broadcast通知主包,主包手动加载service。如果有大神知道如何动态加载service,可以与我交换经验~~哈哈哈

【热门文章】
【热门文章】