【发布时间】:2015-06-19 07:03:34
【问题描述】:
我想从我的超类中调用一个子类函数(它扩展了活动)。但是,我找不到子类的实例,所以我只是天真地尝试向下转换我的抽象超类并调用它的方法来看看会发生什么。我没想到这会起作用 - 超类怎么知道要在哪个实例上调用该方法?
public abstract class RootActivity extends Activity{
private flag someCondition;
@Override
protected void onCreate(Bundle savedInstanceState){
//...
}
// ...
public void startJob(JobAction.Id jobaction){
Log.d("Zlatan", "started a job");
if (!jobaction.someCondition){
return;
}else{
((SpecificJob) this).dontDelete(); //<--- What have I done?
startSomeLongAsynchronousJob(someCondition);
Log.d("Zlatan", "calling finish");
finish();
}
}
// ...
public void someOtherFunction(){
finish();
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event){
//...
startJob(JobAction.SOMEENUM); //Startjob is being called in the superclass
}
}
}
我在这里有一个子类。该活动是由另一个活动发起的,我在这里也包含了清单 sn-p。
public class SpecificJob extends SomeClassThatExtendsRootActivity{
//SomeClassThatExtendsRootActivity extends RootActivity - I've ommitted it
private boolean flag = false;
@Override
public void onCreate(Bundle bundle){
super.onCreate(bundle);
//...
}
// ... some code ...
public void dontDelete(){ //Not static
flag = true;
Log.d("Zlatan", "I set flag"); //This doesn't appear in log
}
@Override
public void onDestroy(){
Log.d("Zlatan", "When finishing, flag is now " + flag);
}
}
<activity
android:name=".SpecificJob"
android:label="@string/TXT_BOOKMARKS"
android:icon="@drawable/ic_launcher"
android:theme="@style/stuff"
android:launchMode="singleTask"
android:windowSoftInputMode="stateHidden"
android:taskAffinity=".SpecificJob">
<intent-filter>
<action android:name="com.me.feature.SOME_WORKFLOW" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
<meta-data
android:name="concurrency"
android:value="DEFAULT_CONCURRENCES|printer"
/>
</activity>
令我惊讶的是,没有错误或崩溃。我的结果是
D/Zlatan started a job
D/Zlatan calling finish
D/Zlatan﹕ When finishing, flag is now false
我没有看到我在 SpecificJob.dontDelete() 中编写的日志。我的问题是
1) 这在运行时做了什么?为什么我没有看到“I set flag”,为什么没有崩溃?
2) 我怎样才能最好地从 RootActivity 调用 SpecificJob 中的函数?
【问题讨论】:
-
你在哪里调用 startJob ?
-
startJob 在 RootActivity 的多个地方被调用,在 onOptionsItemSelected 和 onKeyDown 等重写函数中。这是我的问题的一部分;我知道我应该在 SpecificJob 类中拦截这些,但我有很多。
标签: java android inheritance casting