javaandroidruntime-error

Java error api level method


I get an error

java.lang.NoSuchMethodError: android.app.Activity.isDestroyed

It has something to do with only running on devices which are api 17 or higher, is there anyway around this?

       private WeakReference<Activity> mActivityRef;

    @Override
        public void onFinish() {

            Activity activity = mActivityRef.get();
//            if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
//do your thing!

                if (activity != null && !activity.isFinishing() && !activity.isDestroyed()) {
                    activity.startActivity(new Intent(activity, ListOfAlarms.class));
                    activity.finish();
                }
                mStarted = false;

//            }
//            Intent goBack = new Intent(CountDownAct.this, ListOfAlarms.class);
//            startActivity(goBack);
//            finish();
        }

Solution

  • This API was added only in API Level 17 Check this!

    To avoid the crash, you can verify with the following code

    if(Build.VERSION.SDK_INT >= VERSION_CODES.JELLY_BEAN_MR1){
    //do your thing!
    }
    

    To get it working on lower API levels, you can create your own BaseActivity.java and add code like this

    public class BaseActivity extends Activity {
        private boolean mDestroyed;
    
        public boolean isDestroyed(){
            return mDestroyed;
        }
    
        @Override
        protected void onDestroy() {
            mDestroyed = true;
            super.onDestroy();
        }
    }
    

    Now, make all your activities extend this BaseActivity as follows

    public class MainActivity extends BaseActivity {
    ...
    }
    

    EDIT (After OP added code snippets)

    First create a BaseActivity.java file as I have shown above. Then, make all your activities extend BaseActivity instead of Activity.

    Now, change

    private WeakReference<Activity> mActivityRef;
    

    to

    private WeakReference<BaseActivity> mActivityRef;
    

    And change

    Activity activity = mActivityRef.get();
    

    to

    BaseActivity activity = mActivityRef.get();