android面试题目(一)

1. 什么是Activity? 

四大组件之一,一般的,一个用户交互界面对应一个activity

setContentView() ,// 要显示的布局

 

2. 请描述一下Activity 生命周期。

共有七个周期函数: 
void onCreate(Bundle savedInstanceState) 

void onStart() 

void onRestart() 
void onResume() 

void onPause() 
void onStop() 
void onDestroy() 
1.完整生命周期: 即一个activity从出现到消失,对应的周期方法是从onCreate到onDestroy 
2.可见生命周期:从onStart()到onStop()方法,在这个周期中,用户可以看见Activity,但不一定能够与之交互,这两个方法可以随着状态的变化被执行多次。 
3.前景生命周期:从onResume()到onPause()方法,在这个周期中,Activity处在其它Activity之前,即在Activity栈的最顶端,负责与用户进行交互,伴随着状态的变化,这两个方法可以被执行多次。

 

3. 两个Activity之间跳转时必然会执行的是哪几个方法。

一般情况比如说有两个activity,分别叫A,B ,当在A里面激活B组件的时候, A 会调用onPause()方法,然后B 调用onCreate() ,onStart(), OnResume() ,这个时候B覆盖了窗体, A会调用onStop()方法.  如果B呢是个透明的,或者是对话框的样式, 就不会调用onStop()方法

 

4. 横竖屏切换时候Activity的生命周期。

 这个生命周期跟清单文件里的配置有关系

1、不设置Activity的android:configChanges时,切屏会重新调用各个生命周期

默认首先销毁当前activity,然后重新加载

2、设置Activity的android:configChanges="orientation|keyboardHidden"时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法

游戏开发中, 屏幕的朝向都是写死的. 

 

5. 如何将一个Activity设置成窗口的样式。

可以自定义一个activity的样式,详细见手机卫士的程序详细信息

android:theme="@style/FloatActivity"  

E:\day9\mobilesafe\res\values\style

 

6. 你后台的Activity被系统回收怎么办?如果后台的Activity由于某原因被系统回收可了,如何在被系统回收之前保存当前状态?

除了在栈顶的activity,其他的activity都有可能在内存不足的时候被系统回收,一个activity越处于栈底,被回收的可能性越大.

protected void onSaveInstanceState(BundleoutState) {

         super.onSaveInstanceState(outState);

         outState.putLong("id",1234567890);

}

public void onCreate(BundlesavedInstanceState) {

//判断savedInstanceState是不是空.

//如果不为空就取出来

       super.onCreate(savedInstanceState);

}

 

7. 如何退出Activity?如何安全退出已调用多个Activity的Application?

退出activity 直接调用finish () 方法. //用户点击back键就是退出一个activity 

退出activity 会执行onDestroy()方法.

1、抛异常强制退出:

该方法通过抛异常,使程序Force Close。

验证可以,但是,需要解决的问题是,如何使程序结束掉,而不弹出Force Close的窗口。

//安全结束进程    android.os.Process.killProcess(android.os.Process.myPid());

2、记录打开的Activity:

每打开一个Activity,就记录下来。在需要退出时,关闭每一个Activity即可。

List<Activity> lists ; 在application 全集的环境里面

lists = new ArrayList<Activity>();

lists.add(activity);

for(Activity activity: lists)

{

         activity.finish();

}

3、发送特定广播:

在需要结束应用时,发送一个特定的广播,每个Activity收到广播后,关闭即可。

//给某个activity 注册接受接受广播的意图     

         registerReceiver(receiver,filter)

//如果过接受到的是关闭activity的广播  就调用finish()方法把当前的activity finish()掉

4、递归退出

在打开新的Activity时使用startActivityForResult,然后自己加标志,在onActivityResult中处理,递归关闭。

上面是网上的一些做法.

其实可以通过intent的flag 来实现.. intent.setFlag(FLAG_ACTIVITY_CLEAR_TOP)激活一个新的activity,然后在新的activity的oncreate方法里面finish掉.

Intent intent = new Intent(this,B.class);

intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

局限性:所有的activity的启动模式都要是默认的启动模式

 

8.service是否在mainthread中执行, service里面是否能执行耗时的操作?

默认情况,如果没有显示的指定service所运行的进程, Service和activity是运行在当前app所在进程的main thread(UI主线程)里面  

service里面不能执行耗时的操作(网络请求,拷贝数据库,大文件)

在子线程中执行new Thread(){}.start();

特殊情况,可以在清单文件配置service 执行所在的进程,让service在另外的进程中执行                   

<service android:process="cn.itcast.xxx"></service>

 

9. 两个Activity之间怎么传递数据?

基本数据类型可以通过.  Intent 传递数据  

extras.putDouble(key, value)

intent.putExtra(name, value)  

// 通过intent putExtra 方法基本数据类型都传递

         Bundlebundle = new  Bundle();

             bumdle.putShort(key, value);

             intent.putExtras(bundle);

intent.putExtras(bundle)

获取到激活他的  getIntent();

       Intent intent = getIntent();

       Bundle bundle = intent.getExtras();

intent.getStringExtra("key","value");

intent.getBooleanExtra("key","value")

Application 全局里面存放对象,自己去实现自己的application的这个类,基础系统的application, 每个activity都可以取到

让对象实现implements  Serializable 接口把对象存放到文件上.  

让类实现Serializable 接口,然后可以通过ObjectOutputStream                //对象输出流  

                   Filefile = new File("c:\\1.obj");

                   FileOutputStreamfos  = new FileOutputStream(file);

                  ObjectOutputStream oos = newObjectOutputStream(fos);

                   

                   Studentstu = new Student();

                   stu.setId("10001");

                   stu.setName("zs");

                   oos.writeObject(stu);

                   

                   FileInputStreamfis = new FileInputStream(file);

                   ObjectInputStreamois = new ObjectInputStream(fis);

                    Student stu1 = (Student) ois.readObject();

                   System.out.println(stu1.getName());

 

Parcelable 和Serializable 

Parcelable 把对象序列化到android操作系统的一块公用的内存空间

文件/网络

intent.setData(Uri) 

Uri.fromFile();  //大图片的传递

contentResolver.getInputStream(url);

 

10. 怎么让在启动一个Activity是就启动一个service?

在activity的onCreate()方法里面startService();

11. 同一个程序,但不同的Activity是否可以放在不同的Task任务栈中?

比方说在激活一个新的activity时候, 给intent设置flag

Intent的flag添加FLAG_ACTIVITY_NEW_TASK

   这个被激活的activity就会在新的task栈里面…

         Intentintent = new Intent(A.this,B.class);

         intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

         startActivity(intent);

 

12.Activity怎么和service绑定,怎么在activity中启动自己对应的service?

startService() 一旦被创建  调用着无关   没法使用service里面的方法

bindService () 把service 与调用者绑定 ,如果调用者被销毁,service会销毁

bindService() 我们可以使用service里面的方法

         bindService().  让activity能够访问到 service里面的方法

         构建一个intent对象,

Intent service = newIntent(this,MyService.class);

 通过bindService的方法去启动一个服务,

     bindService(intent, new MyConn(),BIND_AUTO_CREATE);

         ServiceConnection对象(重写onServiceConnected和OnServiceDisconnected方法) 和BIND_AUTO_CREATE.

         privateclass myconn implements ServiceConnection

 

         {

 

                   publicvoid onServiceConnected(ComponentName name, IBinder service) {

                            //TODO Auto-generated method stub

                            //可以通过IBinder的对象去使用service里面的方法

                   }

 

                   publicvoid onServiceDisconnected(ComponentName name) {

                            //TODO Auto-generated method stub

                            

                   }

                   

         }

 

13.什么是Service以及描述下它的生命周期。Service有哪些启动方法,有什么区别,怎样停用Service?

在Service的生命周期中,被回调的方法比Activity少一些,只有onCreate, onStart, onDestroy,

onBind和onUnbind。

通常有两种方式启动一个Service,他们对Service生命周期的影响是不一样的。

1 通过startService

   Service会经历 onCreate 到onStart,然后处于运行状态,stopService的时候调用onDestroy方法。

   如果是调用者自己直接退出而没有调用stopService的话,Service会一直在后台运行。

  2 通过bindService   

   Service会运行onCreate,然后是调用onBind,这个时候调用者和Service绑定在一起。调用者退出了,Srevice就会调用onUnbind->onDestroyed方法。

   所谓绑定在一起就共存亡了。调用者也可以通过调用unbindService方法来停止服务,这时候Srevice就会调用onUnbind->onDestroyed方法。

需要注意的是如果这几个方法交织在一起的话,会出现什么情况呢?

一个原则是Service的onCreate的方法只会被调用一次,就是你无论多少次的startService又bindService,Service只被创建一次。

如果先是bind了,那么start的时候就直接运行Service的onStart方法,如果先是start,那么bind的时候就直接运行onBind方法。

如果service运行期间调用了bindService,这时候再调用stopService的话,service是不会调用onDestroy方法的,service就stop不掉了,只能调用UnbindService, service就会被销毁

如果一个service通过startService 被start之后,多次调用startService 的话,service会多次调用onStart方法。多次调用stopService的话,service只会调用一次onDestroyed方法。

如果一个service通过bindService被start之后,多次调用bindService的话,service只会调用一次onBind方法。

多次调用unbindService的话会抛出异常。

 

15. 不用service,B页面为音乐播放,从A跳转到B,再返回,如何使音乐继续播放?

 这个问题问的很山寨.默认不做任何处理,B里面的音乐都能播放. 

遇到问题, 可以随机应变,灵活发挥,多考虑些细节,比如说这个题就可以这样说,说说你对startActivityForResult的理解()

A开启B的时候,用startActivityForResult()方法, B返回的时候把播放的状态信息返回给A ,A继续播放音乐. 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值