java - 请问android app如何启动DexClassLoader动态加载的jar包中定义的service
怪我咯
怪我咯 2017-04-17 11:55:18
[Java讨论组]

架构需求就是这样,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>

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

怪我咯
怪我咯

走同样的路,发现不同的人生

全部回复(2)
PHPz
  • 检查下jarservicetest.jar文件里包含的是class文件还是dex文件
  • 拿sdcard路径的时候,用Environment.getExternalStorageDirectory()
天蓬老师

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

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号