Android 面试题(一)

1静态内部类,内部类,匿名内部类,为什么内部类会持有外部类的引用?持有的应用是this,还是别的?
静态内部类:用static修饰的内部类
内部类:在一个类的内部重新创建一个类
匿名内部类:使用new生成的内部类
内部类的产生依赖于外部类,持有的是类名.this

2arraylist和vector的区别:
java1.2 以后开始引入的vector
vector:线程同步,当vector的元素超过初始大小的时候,vector会将他的容量翻倍。
arraylist:线程不同步,当arraylist的元素超过初始大小时,容量增加50%。。。

3Java中try catch finally 执行顺序
try===异常===catch===finally最后肯定走

4Java switch的作用类型
byte,int ,short,char,枚举,五中类型
java1.7以后增加了String

5activity 和fragment的生命周期
activity : onCreate==》onStart===》onResume===>onPause===>onStop===>onDestroy
fragment: onAttach===>onCreate===>onCreateView===>onActityCreated===>onStart===>onResume===>onPause===>onStop===>onDestroyView===>onDestroy===>onDetach
这里写图片描述

6Android Activity什么时候进入“运行态”,什么时候进入“暂停态”,什么时候进入“停止态”?重新进入“运行态”需要经过哪几个生命周期?
运行态:经过onResume后进入运行态
暂停态:新的activity没有完全盖住原来的activity时,原来的activity进入暂停态
停止态: 新的activity完全盖住原来的activity时,原来的activity进入停止态
暂停态===》运行态:onPause==》onResume
停止态===》运行态:onStop==》onRestart==》onStart===》onResume

 onCreate: 在这里创建界面 ,做一些数据的初始化工作
 onStart: 到这一步变成用户可见不可交互 的
 onResume: 变成和用户可交互 的,(在activity 栈系统通过栈的方式管理这些个
 Activity的最上面,运行完弹出栈,则回到上一个Activity)
 onPause: 到这一步是可见但不可交互 的,系统会停止动画 等消耗CPU 的事情
 从上文的描述已经知道,应该在这里保存你的一些数据,因为这个时候
 你的程序的优先级降低,有可能被系统收回。在这里保存的数据,应该在
 onResume里读出来,注意:这个方法里做的事情时间要短,因为下一
 个activity不会等到这个方法完成才启动
 onstop: 变得不可见 ,被下一个activity覆盖了
 onDestroy: 这是activity被干掉前最后一个被调用方法了,可能是外面类调用finish方
 法或者是系统为了节省空间将它暂时性的干掉,可以用isFinishing()来判
 断它,如果你有一个Progress Dialog在线程中转动,请在onDestroy里
 把他cancel掉,不然等线程结束的时候,调用Dialog的cancel方法会抛
 异常的。
 
 7Android 横竖屏切换生命周期的变化?
  ①竖屏装换成横屏:onSaveInstanceState–>onPause–>onStop–>onDestroy–>onCreate–>onStart–>onRestoreInstanceState–>onResume–>
  ②由横屏转竖屏生命周期①执行两遍。
  总结:
1、不设置Activity的android:configChanges时,切屏会重新调用各个生命周期,切 横屏时会执行一次,切竖屏时会执行两次
2、设置Activity的android:configChanges=”orientation”时,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次
3、设置Activity的android:configChanges=”orientation|keyboardHidden”时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法

8Android onPause保存数据和onSaveInstanceState方法的区别?
onSaveInstanceState这个方法肯定在onstop之前,但是不一定在onpause之前或者 之后
onSaveInstanceState:保存一些临时数据,比如:editext输入的文字,checkbox的选中状态,scrollview滑动位置,视频的播放进度。Android的editext等控件具有自动保存的功能,没必要实现onSaveInstanceState方法,但是必须要有id。
onPause:保存持久化的数据,比如忘数据库中插入一条数据。但是不要做大量的操作。否则会影响activity入栈。
9 dipatchTouchEevent,onInterceptTouchEvent,onTouchEvent三者的区别?
dispatchTouchEvent:事件分发
onInterceptTouchEvent:事件拦截
onTouchEvent:事件处理
10 ReMoteView在哪些功能中使用?
Notifycation(自定义通知栏布局)和appWiget
11SurfaceView 和view 的区别
surfaceview:采用双缓冲技术,在单独的线程中更行界面
view:在ui线程中更新界面
12Android中进程的优先级?
前台进程,可见进程,服务进程,后台进程,空进程
13Android中那些情况会出现内存泄漏
内存泄漏的原因:当某个对象已经停止使用,本应该被回收,但是别的对象仍然持有该对象的引用,导致该对象部内被及时的回收,从而留在堆内存中,从而产生了内存泄漏。
内存泄漏的影响:oom,程序的崩溃。
①错误的使用单例模式

  public class AppManager {
    private static AppManager instance;
    private Context context;
    private AppManager(Context context) {
        this.context = context;
    }
    public static AppManager getInstance(Context context) {
        if (instance != null) {
            instance = new AppManager(context);
        }
        return instance;
    }
}

1、传入的是Application的Context:这将没有任何问题,因为单例的生命周期和Application的一样长
2、传入的是Activity的Context:当这个Context所对应的Activity退出时,由于该Context和Activity的生命周期一样长(Activity间接继承于Context),所以当前Activity退出时它的内存并不会被回收,因为单例对象持有该Activity的引用。
所以,正确的写法

public class AppManager {
    private static AppManager instance;
    private Context context;
    private AppManager(Context context) {
        this.context = context.getApplicationContext();
    }
    public static AppManager getInstance(Context context) {
        if (instance != null) {
            instance = new AppManager(context);
        }
        return instance;
    }
}

②handler使用造成

public class MainActivity extends AppCompatActivity {
    private Handler mHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            //...
        }
    };
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        loadData();
    }
    private void loadData(){
        //...request
        Message message = Message.obtain();
        mHandler.sendMessage(message);
    }
}

在这种情况之下,如果activity销毁,但是消息队列中还有未处理的message,message持有handler的引用,二handler持有activity的引用,造成了内粗泄漏。

public class MainActivity extends AppCompatActivity {
    private MyHandler mHandler = new MyHandler(this);
    private TextView mTextView ;
    private static class MyHandler extends Handler {
        private WeakReference<Context> reference;
        public MyHandler(Context context) {
            reference = new WeakReference<>(context);
        }
        @Override
        public void handleMessage(Message msg) {
            MainActivity activity = (MainActivity) reference.get();
            if(activity != null){
                activity.mTextView.setText("");
            }
        }
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mTextView = (TextView)findViewById(R.id.textview);
        loadData();
    }

    private void loadData() {
        //...request
        Message message = Message.obtain();
        mHandler.sendMessage(message);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        mHandler.removeCallbacksAndMessages(null);
    }
}

创建一个静态Handler内部类,然后对Handler持有的对象使用弱引用,这样在回收时也可以回收Handler持有的对象,使用mHandler.removeCallbacksAndMessages(null);是移除消息队列中所有消息和所有的Runnable。当然也可以使用mHandler.removeCallbacks();或mHandler.removeMessages();来移除指定的Runnable和Message。

③线程造成的内存泄漏。

//——————test1
        new AsyncTask<Void, Void, Void>() {
            @Override
            protected Void doInBackground(Void... params) {
                SystemClock.sleep(10000);
                return null;
            }
        }.execute();
//——————test2
        new Thread(new Runnable() {
            @Override
            public void run() {
                SystemClock.sleep(10000);
            }
        }).start();

正确做法:

static class MyAsyncTask extends AsyncTask<Void, Void, Void> {
        private WeakReference<Context> weakReference;

        public MyAsyncTask(Context context) {
            weakReference = new WeakReference<>(context);
        }

        @Override
        protected Void doInBackground(Void... params) {
            SystemClock.sleep(10000);
            return null;
        }

        @Override
        protected void onPostExecute(Void aVoid) {
            super.onPostExecute(aVoid);
            MainActivity activity = (MainActivity) weakReference.get();
            if (activity != null) {
                //...
            }
        }
    }
    static class MyRunnable implements Runnable{
        @Override
        public void run() {
            SystemClock.sleep(10000);
        }
    }
  //——————
    new Thread(new MyRunnable()).start();
    new MyAsyncTask(this).execute();

④资源未关闭造成的内存泄漏
对于使用了BraodcastReceiver,ContentObserver,File,Cursor,Stream,Bitmap等资源的使用,应该在Activity销毁时及时关闭或者注销,否则这些资源将不会被回收,造成内存泄漏。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值