android dexclassloader 资源,android-使用DexClassLoader与动态加载的库进行...

我看到两种解决方法,具体取决于您愿意做什么:

>如果MyClass必须是一个活动

必须使用startActivity()或任何变体来正确启动一个Activity.它也必须在清单中声明.因此,只有当您所有的MyClass变体都具有相同的签名时,以下才起作用.

我假设您的启动代码位于一个Activity中.加载classToLoad之后,您可以执行以下操作:

final File tmpDir = getDir("dex", 0);

final String libPath = Environment.getExternalStorageDirectory() + "/test.jar";

final DexClassLoader classloader = new DexClassLoader(libPath, tmpDir.getAbsolutePath(), null, this.getClass().getClassLoader());

try {

final Class classToLoad = (Class) classloader.loadClass("org.shlublu.android.sandbox.MyClass");

// CHANGED: THIS STARTS PROPERLY YOUR ACTIVITY ONCE THE CLASS LOADED

final Intent intent = new Intent(this, classToLoad);

startActivity(intent);

} catch (ClassNotFoundException e) {

// handle that Exception properly here

}

现在以某种方式更改doSomething(),使其使用新Activity的基础上下文而不是getApplicationContext().然后例如从MyClass.onCreate()调用它,然后看它是否有效:

public class MyClass extends Activity {

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

doSomething(); // CHANGED: just as an example

}

private void doSomething() {

// CHANGED: now the following line uses 'this' instead of `getApplicationContext()`

Toast.makeText(this, "MyClass: doSomething() called.", Toast.LENGTH_LONG).show();

Log.d(MyClass.class.getName(), "MyClass: doSomething() called.");

}

}

其余的-什么时候调用doSomething(),为什么等等…-完全取决于您愿意做什么.

>如果MyClass只需要显示一个Toast

在这种情况下,无需创建另一个活动. doSomething()只需接收适当的上下文即可显示Toast.

如下更改MyClass:

public class MyClass {

private void doSomething(Context ctx) {

Toast.makeText(ctx, "MyClass: doSomething() called.", Toast.LENGTH_LONG).show();

Log.d(MyClass.class.getName(), "MyClass: doSomething() called.");

}

}

并假设您是从Activity运行的,请更改您的启动代码以将其传递给doSomething():

final File tmpDir = getDir("dex", 0);

final String libPath = Environment.getExternalStorageDirectory() + "/test.jar";

final DexClassLoader classloader = new DexClassLoader(libPath, tmpDir.getAbsolutePath(), null, this.getClass().getClassLoader());

try {

final Class classToLoad = (Class) classloader.loadClass("org.shlublu.android.sandbox.MyClass");

// CHANGED: LOADS THE METHOD doSomething(Context). EXECUTES IT WITH this AS AN ARGUMENT

final Class[] args = new Class[1];

args[0] = Context.class;

final Method doSomething = classToLoad.getMethod("doSomething", args);

final Object myInstance = classToLoad.newInstance();

doSomething.invoke(myInstance, this);

} catch (ClassNotFoundException e) {

// handle that Exception properly here

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值