Android面试题大全之Activity

2025-10-23 12:54:21

1、什么是Activity?

-------------------------------------------------------------------------------------------------------

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

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

activity 是Context的子类,

同时实现了window.callback和keyevent.callback, 

可以处理与窗体用户交互的事件.

button.setOnclickLinstener{

}

开发常用的的有ListActivity  , PreferenceActivity ,TabAcitivty等…

如果界面有共同的特点或者功能的时候,还会自己定义一个BaseActivity

2、请描述一下Activity 生命周期?

-------------------------------------------------------------------------------------------------------

生命周期描述的是一个类从创建(new出来)到死亡(垃圾回收)的过程中会执行的方法..

在这个过程中 会针对不同的生命阶段会调用不同的方法

Activity从创建到销毁有多种状态,

从一种状态到另一种状态时会激发相应的回调方法,这些回调方法包括:oncreate ondestroy onstop onstart onresume onpause

其实这些方法都是两两对应的,(如下图)

onCreate创建与onDestroy销毁;

onStart可见与onStop不可见;

onResume可编辑(即焦点)与onPause;

对话框的弹出, 

Activity.this对话框是activity的一部分.这6个方法是相对应的,

那么就只剩下一个onRestart方法了,这个方法在什么时候调用呢?

答案就是:在Activity被onStop后,但是没有被onDestroy,

在再次启动此Activity时就调用onRestart(而不再调用onCreate)方法;

如果被onDestroy了,则是调用onCreate方法。

最后讲自己项目中的经验,比如说客户端每次进入某个界面的时候都要看到最新的数据,这个刷新列表的操作 就放在onStart()的方法里面.

这样保证每次用户看到的数据都是最新的

Android面试题大全之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,

然后重新加载Onpause onstop ondestory oncreate onstart onresume

2、设置Activity的android:configChanges="orientation|keyboardHidden"时,

切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法

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

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

-------------------------------------------------------------------------------------------------------

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

protected void onSaveInstanceState(Bundle outState){

super.onSaveInstanceState(outState);

outState.putLong("id", 1234567890);

}

public void onCreate(Bundle savedInstanceState) {

//判断 savedInstanceState是不是空.

//如果不为空就取出来        

super.onCreate(savedInstanceState);

}

6、如何退出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>();

每一个activity在执行oncreate()方法的时候

 lists.add(this);

在Ondestory() 

lists.remove(this);

lists.add(activity);

for(Activity activity: lists){

activity.finish();

}

3、发送特定广播:

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

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

registerReceiver(receiver, filter)

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

4、递归退出

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

404 退出程序OnActivityResult();

7、两个Activity之间怎么传递数据?

-------------------------------------------------------------------------------------------------------

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

extras.putDouble(key, value)

intent.putExtra(name, value) 

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

Bundle bundle = new  Bundle();    

bundle.putShort(key, value);    

intent.putExtras(bundle);

intent.putExtras(bundle)

获取到激活他的  getIntent();        

Intent intent = getIntent();        

Bundle bundle = intent.getExtras();

Bundle 类似map的集合 

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

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

Application 全局里面存放 对象 ,

自己去实现自己的application的这个类,

基础系统的application , 每个activity都可以取到让对象实现 implements  Serializable 接口把对象存放到文件上. 

让类实现Serializable 接口,

然后可以通过 

ObjectOutputStream  //对象输出流   

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

FileOutputStream fos  = new FileOutputStream(file);

ObjectOutputStream oos = new ObjectOutputStream(fos);

Student stu = new Student();

stu.setId("10001");

stu.setName("zs");

oos.writeObject(stu);

FileInputStream fis = new FileInputStream(file);

ObjectInputStream ois = new ObjectInputStream(fis);

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

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

Parcelable 和 Serializable Parcelable 把对象序列化到android操作系统 的一块公用的内存空间 文件/网络 

//传递数据的引用 intent.setData(Uri)Uri.fromFile();  

//大图片的传递contentResolver.getInputStream(uri);

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

-------------------------------------------------------------------------------------------------------

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

singleinstance  单独的任务栈   

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

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

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

startActivity(intent);

1、怎么让在启动一个Activity是就启动一个service?

-------------------------------------------------------------------------------------------------------

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

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

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

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

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

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

构建一个intent对象,

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

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

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

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

private class myconn implements ServiceConnection{

     public void onServiceConnected(ComponentName name, IBinder service) {

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

     }

     public void onServiceDisconnected(ComponentName name) {

     }

}

3、请描述一下Intent 和 Intent Filter。

-------------------------------------------------------------------------------------------------------

Android 中通过 Intent 对象来表示一条消息,一个 Intent 对象不仅包含有这个消息的目的地,还可以包含消息的内容,这好比一封 Email,其中不仅应该包含收件地址,还可以包含具体的内容。

对于一个 Intent 对象,消息“目的地”是必须的,而内容则是可选项。通过Intent 可以实现各种系统组件的调用与激活. 

Intent filter: 可以理解为邮局或者是一个信笺的分拣系统…这个分拣系统通过3个参数来识别Action: 

动作  

Intent.ation_view 

Data: 数据uri   uri  

mimeCategory : 而外的附加信息 

Action 匹配

Action 是一个用户定义的字符串,用于描述一个 Android 应用程序组件,

一个 Intent Filter 可以包含多个 Action。

在 AndroidManifest.xml 的 Activity 定义时可以在其 <intent-filter >节点指定一个 Action 列表用于标示 Activity 所能接受的“动作”,

例如: 

<intent-filter > 

<action android:name="android.intent.action.MAIN" /> 

<action android:name="cn.itcast.action" />

…… 

</intent-filter>

如果我们在启动一个 Activity 时使用这样的 Intent 对象: 

Intent intent =new Intent(); 

intent.setAction("cn.itcast.action");

那么所有的 Action 列表中包含了“cn.itcast”的 Activity 都将会匹配成功。Android 预定义了一系列的 Action 分别表示特定的系统动作。这些 Action 通过常量的方式定义在 android.content. Intent中,以“ACTION_”开头。我们可以在 Android 提供的文档中找到它们的详细说明。URI 数据匹配一个 Intent 可以通过 URI 携带外部数据给目标组件。在 <intent-filter >节点中,通过 <data/>节点匹配外部数据。mimeType 属性指定携带外部数据的数据类型,scheme 指定协议,host、port、path 指定数据的位置、端口、和路径。

如下: 

<data 

android:mimeType="mimeType" 

android:scheme="scheme" 

android:host="host" 

android:port="port" 

android:path="path"/>

电话的uri   tel: 12345  http://www.baidu.com

自己定义的uri  itcast://cn.itcast/person/10

如果在 Intent Filter 中指定了这些属性,那么只有所有的属性都匹配成功时

 URI 数据匹配才会成功。

Category 类别匹配<intent-filter >节点中可以为组件定义一个 Category 类别列表,当 Intent 中包含这个列表的所有项目时 Category 类别匹配才会成功。默认是DEFAULT

4、说说Activity,Intent,Service是什么关系 。麦当劳和麦当娜的关系是什么关系?

-------------------------------------------------------------------------------------------------------

这种问题,就讲下activity,讲一下service,说一下 通过intent去激活组件,

传递数据.

说自己项目中有这样一个网络更新的功能,显示界面就用的activity, 

后台有个service每隔半小时都去访问下服务器获取更新的数据…

开启服务用的是intent来开启

1. 请描述一下Broadcast Receiver。有很多广播接收者 ,系统已经实现了.广播分两种有序广播无序广播指定接收者的广播 .  是不可以被拦截掉的 

<intent-filter android:priority="1000">

<action 

     android:name="android.provider.Telephony.SMS_RECEIVED"/>

</intent-filter>

onReceive() 

方法.abortBroadcast();有序广播有一个特例  

sendOrderedBroadcast(intent, receiverPermission, resultReceiver, scheduler, initialCode, initialData, initialExtras);

resultReceiver 广播接受者 

如果我们显示的指定了广播接收者 无论如何 都会接受广播 时间 abortBroadcast(); 

的方法不会终止广播时间   

SetresultData(); 

StickysendStickyBroadcast(intent)  

// 阴魂不散的广播 Wifi设置 用于接收系统的广播通知, 系统会有很多sd卡挂载,手机重启,广播通知,低电量,来短信等,一个apk的安装成功…. 手机卫士中自定义一个broadcast receiver

<intent-filter  android:>

 <action> sms_received </action> 

 </intent-filter>

来获取短信到来的广播, 根据黑名单来判断是否拦截该短信. 画画板生成图片后,发送一个sd挂载的通知,通知系统的gallery去获取到新的图片.

Intent intent = new Intent(Intent.ACTION_MEDIA_MOUNTED,Uri.parse("file://"+Environment.getExternalStorageDirectory()));

sendBroadcast(intent);

5、Service和Activity在同一个线程吗?

------------------------------------------------------------------------------------------------------- 默认情况同一线程 main主线程 ui线程

6、widget相对位置的完成在activity的哪个生命周期阶段实现。-------------------------------------------------------------------------------------------------------widget可以理解成桌面小控件,

也可以理解成 某个button, imageview这样的控件…

onmeasure() // 计算 

控件在屏幕上的位子某个view 要显示在界面  

ondraw 

被显示到界面上的

声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
猜你喜欢