Android开发四大组件详解

Android开发四大组件详解
Android开发四大组件详解

一、Activity详解

二、Service详解

三、Broadcast Receiver详解

四、Content Provider详解

外加一个重要组件 intent的详解。

文章有部分内容来自网络,本文是一个总结性文章。

一、Activity详解

Activty的生命周期的也就是它所在进程的生命周期。

一个Activity的启动顺序:

onCreate()——>onStart()——>onResume()

当另一个Activity启动时:

第一个Activity onPause()——>第二个Activity onCreate()——>onStart()——>onResume()

——>第一个Activity onStop()

当返回到第一个Activity时:

第二个Activity onPause() ——> 第一个Activity onRestart()——>onStart()——>onResume() ——>第二个Activity onStop()——>onDestroy()

一个Activity的销毁顺序:

(情况一)onPause()——>

(情况二)onPause()——>onStop()——>

(情况三)onPause()——>onStop()——>onDestroy()

每一个活动( Activity )都处于某一个状态,对于开发者来说,是无法控制其应用程序处于某一个状态的,这些均由系统来完成。

但是当一个活动的状态发生改变的时候,开发者可以通过调用 onXX() 的方法获取到相关的通知信息。

在实现 Activity 类的时候,通过覆盖( override )这些方法即可在你需要处理的时候来调用。

一、 onCreate:当活动第一次启动的时候,触发该方法,可以在此时完成活动的初始化工作。onCreate 方法有一个参数,该参数可以为空( null ),也可以是之前调用 onSaveInstanceState ()方法保存的状态信息。

二、 onStart:该方法的触发表示所属活动将被展现给用户。

三、 onResume:当一个活动和用户发生交互的时候,触发该方法。

四、 onPause :当一个正在前台运行的活动因为其他的活动需要前台运行而转入后台运行的时候,触发该方法。这时候需要将活动的状态持久化,比如正在编辑的数据库记录等。

五、 onStop:当一个活动不再需要展示给用户的时候,触发该方法。如果内存紧张,系统会直接结束这个活动,而不会触发 onStop 方法。所以保存状态信息是应该在onPause时做,而不是onStop 时做。活动如果没有在前台运行,都将被停止或者Linux管理进程为了给新的活动预留足够的存储空间而随时结束这些活动。因此对于开发者来说,在设计应用程序的时候,必须时刻牢记这一原则。在一些情况下,onPause方法或许是活动触发的最后的方法,因此开发者需要在这个时候保存需要保存的信息。

六、onRestart:当处于停止状态的活动需要再次展现给用户的时候,触发该方法。

七、 onDestroy :当活动销毁的时候,触发该方法。和 onStop 方法一样,如果内存紧张,系统会直接结束这个活动而不会触发该方法。

· onSaveInstanceState :系统调用该方法,允许活动保存之前的状态,比如说在一串字符串中的光标所处的位置等。

通常情况下,开发者不需要重写覆盖该方法,在默认的实现中,已经提供了自动保存活动所涉及到的用户界面组件的所有状态信息。

Activity栈

上面提到开发者是无法控制Activity的状态的,那Activity的状态又是按照何种逻辑来运作的呢?这就要知道 Activity 栈。

每个Activity的状态是由它在Activity栈(是一个后进先出LIFO,包含所有正在运行Activity的队列)中的位置决定的。

当一个新的Activity启动时,当前的活动的Activity将会移到Activity栈的顶部。

如果用户使用后退按钮返回的话,或者前台的Activity结束,活动的Activity就会被移出栈消亡,而在栈上的上一个活动的Activity将会移上来并变为活动状态。如下图所示:

一个应用程序的优先级是受最高优先级的Activity影响的。当决定某个应用程序是否要终结去释放资源,Android内存管理使用栈来决定基于Activity的应用程序的优先级。

Activity状态

一般认为Activity有以下四种状态:

活动的:当一个Activity在栈顶,它是可视的、有焦点、可接受用户输入的。Android试图尽最大可能保持它活动状态,杀死其它Activity来确保当前活动Activity有足够的资源可使用。当另外一个Activity被激活,这个将会被暂停。

暂停:在很多情况下,你的Activity可视但是它没有焦点,换句话说它被暂停了。有可能原因是一个透明或者非全屏的Activity被激活。

当被暂停,一个Activity仍会当成活动状态,只不过是不可以接受用户输入。在极特殊的情况下,Android将会杀死一个暂停的Activity来为活动的Activity提供充足的资源。当一个Activity变为完全隐藏,它将会变成停止。

停止:当一个Activity不是可视的,它“停止”了。这个Activity将仍然在内存中保存它所有的状态和会员信息。尽管如此,当其它地方需要内存时,它将是最有可能被释放资源的。当一个Activity停止后,一个很重要的步骤是要保存数据和当前UI状态。一旦一个Activity退出或关闭了,它将变为待用状态。

待用:在一个Activity被杀死后和被装在前,它是待用状态的。待用Acitivity被移除Activity 栈,并且需要在显示和可用之前重新启动它。

activity的四种加载模式

在android的多activity开发中,activity之间的跳转可能需要有多种方式,有时是普通的生成一个新实例,有时希望跳转到原来某个activity实例,而不是生成大量的重复的activity。加载模式便是决定以哪种方式启动一个跳转到原来某个Activity实例。

在android里,有4种activity的启动模式,分别为:

·standard: 标准模式,一调用startActivity()方法就会产生一个新的实例。

·singleTop: 如果已经有一个实例位于Activity栈的顶部时,就不产生新的实例,而只是调用Activity中的newInstance()方法。如果不位于栈顶,会产生一个新的实例。

·singleTask: 会在一个新的task中产生这个实例,以后每次调用都会使用这个,不会去产生新的实例了。

·singleInstance: 这个跟singleTask基本上是一样,只有一个区别:在这个模式下的Activity实例所处的task中,只能有这个activity实例,不能有其他的实例。

这些启动模式可以在功能清单文件AndroidManifest.xml中进行设置,中的launchMode属性。

相关的代码中也有一些标志可以使用,比如我们想只启用一个实例,则可以使用

Intent.FLAG_ACTIVITY_REORDER_TO_FRONT 标志,这个标志表示:如果这个activity已经启动了,就不产生新的activity,而只是把这个activity实例加到栈顶来就可以了。

Intent intent = new Intent(ReorderFour.this, ReorderTwo.class);

intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);

startActivity(intent);

Activity的加载模式受启动Activity的Intent对象中设置的Flag和manifest文件中Activity的元素的特性值交互控制。

下面是影响加载模式的一些特性

核心的Intent Flag有:

FLAG_ACTIVITY_NEW_TASK

FLAG_ACTIVITY_CLEAR_TOP

FLAG_ACTIVITY_RESET_TASK_IF_NEEDED

FLAG_ACTIVITY_SINGLE_TOP

核心的特性有:

taskAffinity

launchMode

allowTaskReparenting

clearTaskOnLaunch

alwaysRetainTaskState

finishOnTaskLaunch

四种加载模式的区别

所属task的区别

一般情况下,“standard”和”singleTop”的activity的目标task,和收到的Intent的发送者在同一个task内,就相当于谁调用它,它就跟谁在同一个Task中。

除非Intent包括参数FLAG_ACTIVITY_NEW_TASK。如果提供了

FLAG_ACTIVITY_NEW_TASK参数,会启动到别的task里。

“singleTask”和”singleInstance” 总是把要启动的activity作为一个task的根元素,他们不会被启动到一个其他task里。

是否允许多个实例

“standard”和”singleTop”可以被实例化多次,并且是可以存在于不同的task中;这种实例化时一个task可以包括一个activity的多个实例;

“singleTask”和”singleInstance”则限制只生成一个实例,并且是task的根元素。

singleTop 要求如果创建intent的时候栈顶已经有要创建的Activity的实例,则将intent发送给该实例,而不创建新的实例。

是否允许其它activity存在于本task内

“singleInstance”独占一个task,其它activity不能存在那个task里;

如果它启动了一个新的activity,不管新的activity的launch mode 如何,新的activity都将会到别的task里运行(如同加了FLAG_ACTIVITY_NEW_TASK参数)。

而另外三种模式,则可以和其它activity共存。

是否每次都生成新实例

“standard”对于每一个启动Intent都会生成一个activity的新实例;

“singleTop”的activity如果在task的栈顶的话,则不生成新的该activity的实例,直接使用栈顶的实例,否则,生成该activity的实例。

比如:

现在task栈元素为A-B-C-D(D在栈顶),这时候给D发一个启动intent,如果D是“standard”的,则生成D的一个新实例,栈变为A-B-C-D-D。

如果D是singleTop的话,则不会生产D的新实例,栈状态仍为A-B-C-D

如果这时候给B发Intent的话,不管B的launchmode是”standard” 还是“singleTop” ,都会生成B 的新实例,栈状态变为A-B-C-D-B。

“singleInstance”是其所在栈的唯一activity,它会每次都被重用。

“singleTask” 如果在栈顶,则接受intent,否则,该intent会被丢弃,但是该task仍会回到前台。当已经存在的activity实例处理新的intent时候,会调用onNewIntent()方法,如果收到intent生成一个activity实例,那么用户可以通过back键回到上一个状态;如果是已经存在的一个activity来处理这个intent的话,用户不能通过按back键返回到这之前的状态。

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

二、Service详解

service可以在和多场合的应用中使用,比如播放多媒体的时候用户启动了其他Activity这个时候程序要在后台继续播放,比如检测SD卡上文件的变化,再或者在后台记录你地理信息位置的改变等等,总之服务嘛,总是藏在后头的。

Service是在一段不定的时间运行在后台,不和用户交互应用组件。每个Service必须在manifest中通过来声明。可以通过contect.startservice和contect.bindserverice来启动。

Service和其他的应用组件一样,运行在进程的主线程中。这就是说如果service需要很多耗时或者阻塞的操作,需要在其子线程中实现。

service的两种模式(startService()/bindService()不是完全分离的):

本地服务 Local Service 用于应用程序内部。

它可以启动并运行,直至有人停止了它或它自己停止。在这种方式下,它以调用

Context.startService()启动,而以调用Context.stopService()结束。它可以调用Service.stopSelf() 或Service.stopSelfResult()来自己停止。不论调用了多少次startService()方法,你只需要调用一次stopService()来停止服务。

用于实现应用程序自己的一些耗时任务,比如查询升级信息,并不占用应用程序比如Activity所属线程,而是单开线程后台执行,这样用户体验比较好。

远程服务 Remote Service 用于android系统内部的应用程序之间。

它可以通过自己定义并暴露出来的接口进行程序操作。客户端建立一个到服务对象的连接,并通过那个连接来调用服务。连接以调用Context.bindService()方法建立,以调用 Context.unbindService()关闭。多个客户端可以绑定至同一个服务。如果服务此时还没有加载,bindService()会先加载它。

可被其他应用程序复用,比如天气预报服务,其他应用程序不需要再写这样的服务,调用已有的即可。

生命周期

使用context.startService() 启动Service是会会经历:

context.startService() ->onCreate()- >onStart()->Service running

context.stopService() | ->onDestroy() ->Service stop

如果Service还没有运行,则android先调用onCreate()然后调用onStart();如果Service已经运行,则只调用onStart(),所以一个Service的onStart方法可能会重复调用多次。

stopService的时候直接onDestroy,如果是调用者自己直接退出而没有调用stopService的话,Service会一直在后台运行。该Service的调用者再启动起来后可以通过stopService关闭Service。

所以调用startService的生命周期为:onCreate --> onStart(可多次调用) --> onDestroy

使用使用context.bindService()启动Service会经历:

context.bindService()->onCreate()->onBind()->Service running

onUnbind() -> onDestroy() ->Service stop

onBind将返回给客户端一个IBind接口实例,IBind允许客户端回调服务的方法,比如得到Service运行的状态或其他操作。这个时候把调用者(Context,例如Activity)会和Service绑定在一起,Context退出了,Srevice就会调用onUnbind->onDestroy相应退出。

所以调用bindService的生命周期为:onCreate --> onBind(只一次,不可多次绑定) --> onUnbind --> onDestory。

在Service每一次的开启关闭过程中,只有onStart可被多次调用(通过多次startService调用),其他onCreate,onBind,onUnbind,onDestory在一个生命周期中只能被调用一次。

而启动service,根据onStartCommand的返回值不同,有两个附加的模式:

1. START_STICKY 用于显示启动和停止service。

2. START_NOT_STICKY或START_REDELIVER_INTENT用于有命令需要处理时才运行的模式。

服务不能自己运行,需要通过调用Context.startService()或Context.bindService()方法启动服务。这两个方法都可以启动Service,但是它们的使用场合有所不同。

1. 使用startService()方法启用服务,调用者与服务之间没有关连,即使调用者退出了,服务仍然运行。

如果打算采用Context.startService()方法启动服务,在服务未被创建时,系统会先调用服务的onCreate()方法,接着调用onStart()方法。

如果调用startService()方法前服务已经被创建,多次调用startService()方法并不会导致多次创建服务,但会导致多次调用onStart()方法。

采用startService()方法启动的服务,只能调用Context.stopService()方法结束服务,服务结束时会调用onDestroy()方法。

2. 使用bindService()方法启用服务,调用者与服务绑定在了一起,调用者一旦退出,服务也就终止,大有“不求同时生,必须同时死”的特点。

onBind()只有采用Context.bindService()方法启动服务时才会回调该方法。该方法在调用者与服务绑定时被调用,当调用者与服务已经绑定,多次调用Context.bindService()方法并不会导致该方法被多次调用。

采用Context.bindService()方法启动服务时只能调用onUnbind()方法解除调用者与服务解除,服务结束时会调用onDestroy()方法。

看看官方给出的比较流程示意图:

官方文档告诉我们,一个service可以同时start并且bind,在这样的情况,系统会一直保持service 的运行状态如果service已经start了或者BIND_AUTO_CREATE标志被设置。如果没有一个条件满足,那么系统将会调用onDestory方法来终止service.所有的清理工作(终止线程,反注册接收器)都在onDestory中完成。

拥有service的进程具有较高的优先级

官方文档告诉我们,Android系统会尽量保持拥有service的进程运行,只要在该service已经被启动(start)或者客户端连接(bindService)到它。当内存不足时,需要保持,拥有service的进程具有较高的优先级。

1.如果service正在调用onCreate,onStartCommand或者onDestory方法,那么用于当前service的进程则变为前台进程以避免被killed。

2.如果当前service已经被启动(start),拥有它的进程则比那些用户可见的进程优先级低一些,但是比那些不可见的进程更重要,这就意味着service一般不会被killed.

3.如果客户端已经连接到service (bindService),那么拥有Service的进程则拥有最高的优先级,可以认为service是可见的。

4.如果service可以使用startForeground(int, Notification)方法来将service设置为前台状态,那么系统就认为是对用户可见的,并不会在内存不足时killed。

如果有其他的应用组件作为Service,Activity等运行在相同的进程中,那么将会增加该进程的重要性。

本地service

1.不需和Activity交互的本地服务

public class LocalService extends Service {

private static final String TAG = "LocalService";

@Override

public IBinder onBind(Intent intent) {

Log.i(TAG, "onBind");

return null;

}

@Override

public void onCreate() {

Log.i(TAG, "onCreate");

super.onCreate();

}

@Override

public void onDestroy() {

Log.i(TAG, "onDestroy");

super.onDestroy();

}

@Override

public void onStart(Intent intent, int startId) { Log.i(TAG, "onStart");

super.onStart(intent, startId);

}

}

Activity:

public class ServiceActivity extends Activity { @Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(https://www.360docs.net/doc/9611890417.html,yout.servicedemo);

((Button) findViewById(R.id.startLocalService)).setOnClickListener( new View.OnClickListener(){

@Override

public void onClick(View view) {

// TODO Auto-generated method stub

startService(new Intent("com.demo.SERVICE_DEMO"));

}

});

((Button) findViewById(R.id.stopLocalService)).setOnClickListener( new View.OnClickListener(){

@Override

public void onClick(View view) {

// TODO Auto-generated method stub

stopService(new Intent("com.demo.SERVICE_DEMO"));

}

});

}

}

在AndroidManifest.xml添加:

否则启动服务时会提示new Intent找不到"com.demo.SERVICE_DEMO"。

对于这类不需和Activity交互的本地服务,是使用startService/stopService的最好例子。

运行时可以发现第一次startService时,会调用onCreate和onStart,在没有stopService前,无论点击多少次startService,都只会调用onStart。而stopService时调用onDestroy。再次点击stopService,会发现不会进入service的生命周期的,即不会再调用onCreate,onStart和onDestroy。

而onBind在startService/stopService中没有调用。

2.本地服务和Activity交互

对于这种case,官方的sample(APIDemo\app.LocalService)是最好的例子:

/**

* This is an example of implementing an application service that runs locally

* in the same process as the application. The {@link LocalServiceController}

* and {@link LocalServiceBinding} classes show how to interact with the

* service.

*

*

Notice the use of the {@link NotificationManager} when interesting things

* happen in the service. This is generally how background services should

* interact with the user, rather than doing something more disruptive such as

* calling startActivity().

*/

public class LocalService extends Service {

private NotificationManager mNM;

/**

* Class for clients to access. Because we know this service always

* runs in the same process as its clients, we don't need to deal with

* IPC.

*/

public class LocalBinder extends Binder {

LocalService getService() {

return LocalService.this;

}

}

@Override

public void onCreate() {

mNM = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);

// Display a notification about us starting. We put an icon in the status bar. showNotification();

}

@Override

public int onStartCommand(Intent intent, int flags, int startId) {

Log.i("LocalService", "Received start id " + startId + ": " + intent);

// We want this service to continue running until it is explicitly

// stopped, so return sticky.

return START_STICKY;

}

@Override

public void onDestroy() {

// Cancel the persistent notification.

mNM.cancel(R.string.local_service_started);

// Tell the user we stopped.

Toast.makeText(this, R.string.local_service_stopped, Toast.LENGTH_SHORT).show(); }

@Override

public IBinder onBind(Intent intent) {

return mBinder;

}

// This is the object that receives interactions from clients. See

// RemoteService for a more complete example.

private final IBinder mBinder = new LocalBinder();

/**

* Show a notification while this service is running.

*/

private void showNotification() {

// In this sample, we'll use the same text for the ticker and the expanded notification CharSequence text = getText(R.string.local_service_started);

// Set the icon, scrolling text and timestamp

Notification notification = new Notification(R.drawable.stat_sample, text,

System.currentTimeMillis());

// The PendingIntent to launch our activity if the user selects this notification

PendingIntent contentIntent = PendingIntent.getActivity(this, 0,

new Intent(this, LocalServiceController.class), 0);

// Set the info for the views that show in the notification panel.

notification.setLatestEventInfo(this, getText(R.string.local_service_label),

text, contentIntent);

// Send the notification.

// We use a layout id because it is a unique number. We use it later to cancel.

mNM.notify(R.string.local_service_started, notification);

}

}

这里可以发现onBind需要返回一个IBinder对象。也就是说和上一例子LocalService不同的是,

1. 添加了一个public内部类继承Binder,并添加getService方法来返回当前的Service对象;

2. 新建一个IBinder对象--new那个Binder内部类;

3. onBind方法返还那个IBinder对象。

Activity:

/**

*

Example of binding and unbinding to the {@link LocalService}.

* This demonstrates the implementation of a service which the client will

* bind to, receiving an object through which it can communicate with the service.

*/

public class LocalServiceBinding extends Activity {

private boolean mIsBound;

private LocalService mBoundService;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(https://www.360docs.net/doc/9611890417.html,yout.local_service_binding);

// Watch for button clicks.

Button button = (Button)findViewById(R.id.bind);

button.setOnClickListener(mBindListener);

button = (Button)findViewById(R.id.unbind);

button.setOnClickListener(mUnbindListener);

}

private ServiceConnection mConnection = new ServiceConnection() {

public void onServiceConnected(ComponentName className, IBinder service) { // This is called when the connection with the service has been

// established, giving us the service object we can use to

// interact with the service. Because we have bound to a explicit

// service that we know is running in our own process, we can

// cast its IBinder to a concrete class and directly access it.

mBoundService = ((LocalService.LocalBinder)service).getService();

// Tell the user about this for our demo.

Toast.makeText(LocalServiceBinding.this, R.string.local_service_connected, Toast.LENGTH_SHORT).show();

}

public void onServiceDisconnected(ComponentName className) {

// This is called when the connection with the service has been

// unexpectedly disconnected -- that is, its process crashed.

// Because it is running in our same process, we should never

// see this happen.

mBoundService = null;

Toast.makeText(LocalServiceBinding.this, R.string.local_service_disconnected, Toast.LENGTH_SHORT).show();

}

};

private OnClickListener mBindListener = new OnClickListener() {

public void onClick(View v) {

// Establish a connection with the service. We use an explicit

// class name because we want a specific service implementation that

// we know will be running in our own process (and thus won't be

// supporting component replacement by other applications).

bindService(new Intent(LocalServiceBinding.this,

LocalService.class), mConnection, Context.BIND_AUTO_CREATE);

mIsBound = true;

}

};

private OnClickListener mUnbindListener = new OnClickListener() {

public void onClick(View v) {

if (mIsBound) {

// Detach our existing connection.

unbindService(mConnection);

mIsBound = false;

}

}

};

}

明显看出这里面添加了一个名为ServiceConnection类,并实现了onServiceConnected(从IBinder获取Service对象)和onServiceDisconnected(set Service to null)。

而bindService和unbindService方法都是操作这个ServiceConnection对象的。

AndroidManifest.xml里添加:

这里没什么特别的,因为service没有需要什么特别的action,所以只是声明service而已,而activity和普通的没差别。

运行时,发现调用次序是这样的:

bindService:

1.LocalService : onCreate

2.LocalService : onBind

3.Activity: onServiceConnected

unbindService: 只是调用onDestroy

可见,onStart是不会被调用的,而onServiceDisconnected没有调用的原因在上面代码的注释有说明。

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

三、Broadcast Receiver详解

BroadcastReceiver 用于异步接收广播Intent。主要有两大类,用于接收广播的:

·正常广播 Normal broadcasts(用 Context.sendBroadcast()发送)是完全异步的。它们都运行在一个未定义的顺序,通常是在同一时间。这样会更有效,但意味着receiver不能包含所要使用的结果或中止的API。

·有序广播 Ordered broadcasts(用 Context.sendOrderedBroadcast()发送)每次被发送到一个receiver。所谓有序,就是每个receiver执行后可以传播到下一个receiver,也可以完全中止传播--不传播给其他receiver。而receiver运行的顺序可以通过matched intent-filter 里面的android:priority来控制,当priority优先级相同的时候,Receiver以任意的顺序运行。

要注意的是,即使是Normal broadcasts,系统在某些情况下可能会恢复到一次传播给一个receiver。特别是receiver可能需要创建一个进程,为了避免系统超载,只能一次运行一个receiver。

Broadcast Receiver 并没有提供可视化的界面来显示广播信息。可以使用Notification和Notification Manager来实现可视化的信息的界面,显示广播信息的内容,图标及震动信息。

生命周期

一个BroadcastReceiver 对象只有在被调用onReceive(Context, Intent)的才有效的,当从该函数返回后,该对象就无效的了,结束生命周期。

因此从这个特征可以看出,在所调用的onReceive(Context, Intent)函数里,不能有过于耗时的操作,不能使用线程来执行。对于耗时的操作,请start service来完成。因为当得到其他异步操作所返回的结果时,BroadcastReceiver 可能已经无效了。

发送广播

事件的广播比较简单,构建Intent对象,可调用sendBroadcast(Intent)方法将广播发出。另外还有sendOrderedBroadcast(),sendStickyBroadcast()等方法,请查阅API Doc。

1.new Intent with action name

Intent intent = new Intent(String action);

或者只是new Intent, 然后

intent.setAction(String action);

2.set data等准备好了后,in activity,

sendBroadcast(Intent); // 发送广播

接收广播

通过定义一个继承BroadcastReceiver类来实现,继承该类后覆盖其onReceiver方法,并在该方法中响应事件。

public class SMSReceiver extends BroadcastReceiver {

@Override

public void onReceive(Context context, Intent intent) {

// get data from SMS intent

Bundle bundle = intent.getExtras();

if (bundle != null){

// get message by "pdus"

Object[] objArray = (Object[]) bundle.get("pdus");

// rebuild SMS

SmsMessage[] messages = new SmsMessage[objArray.length];

for (int i=0; i < objArray.length; i++){

messages[i] = SmsMessage.createFromPdu((byte[])objArray[i]);

StringBuilder str = new StringBuilder("from: ");

str.append(messages[i].getDisplayOriginatingAddress());

str.append("\nmessage:\n");

str.append(messages[i].getDisplayMessageBody());

Toast.makeText(context, str.toString(), Toast.LENGTH_LONG)

.show();

}

}

}

}

注册Receiver

注册有两种方式:

1. 静态方式,在AndroidManifest.xml的application里面定义receiver并设置要接收的action。

Android四大组件

Android四大组件 Android开发平台是开放的平台,而位于四层框架顶端的应用开发,必然涉及到Android组件。本文将为大家详细介绍Android组件。 组件(Component),在谈及所谓架构和重用的时候,是一个重要的事情。很多时候都会说基于组件的软件架构,指的是期望把程序做乐高似的,有一堆接口标准封装完整的组件放在哪里,想用的时候取上几个一搭配,整个程序就构建完成了。 在开篇的时候就在说,Android是一个为组件化而搭建的平台,它引入所谓Mash-Up的概念,这使得你在应用的最上层,想做的不组件化都是很困难的一件事情(底层逻辑,好吧,管不了...)。具体说来,Android有四大组件四喜丸子:Activity、Service、Broadcast Receiver、Content Provider。 Activity 做一个完整的Android程序,不想用到Activity,真的是比较困难的一件事情,除非是想做绿叶想疯了。因为Activity是Android程序与用户交互的窗口,在我看来,从这个层面的视角来看,Android的Activity特像网站的页面。 首先,一个网站,如果一张页面都没有,那...,真是一颗奇葩。而一张页面往往都有个独立的主题和功能点,比如登录页面,注册页面,管理页面,如是。 在每个页面里面,会放一些链接,已实现功能点的串联,有的链接点了,刷,跑到同一站点的另一个页面去了;有的链接点了,啾,可能跳到其他网站的页面去;还有的链接点了,恩...,这次没跑,但当前页面的样子可能有所变化了。这些模式,和Activity给人的感觉很像,只不过实现策略不同罢了,毕竟Android这套架构的核心思想,本身就来自源于Web的Mash-Up概念,视为页面的客户端化,也未尝不可。 Activity,在四大组件中,无疑是最复杂的,这年头,一样东西和界面挂上了勾,都简化不了,想一想,独立做一个应用有多少时间沦落在了界面上,就能琢磨清楚了。从视觉效果来看,一个Activity占据当前的窗口,响应所有窗口事件,具备有控件,菜单等界面元素。从内部逻辑来看,Activity需要为了保持各个界面状态,需要做很多持久化的事情,还需要妥善管理生命周期,和一些转跳逻辑。对于开发者而言,就需要派生一个Activity的子类,然后埋头苦干上述事情。对于Activity的更多细节,先可以参见:reference/android/app/Activity.html。后续,会献上更为详尽的剖析。 Service 服务,从最直白的视角来看,就是剥离了界面的Activity,它们在很多Android的概念方面比较接近,都是封装有一个完整的功能逻辑实现,只不过Service不抛头露脸,只是默默无声的做坚实的后盾。 但其实,换个角度来看,Android中的服务,和我们通常说的Windows服务,Web的后台服务又有一些相近,它们通常都是后台长时间运行,接受上层指令,完成相关事务的模块。

Android程序设计教程教学大纲

《Android 程序设计课程》课程教学大纲 一、课程基本信息 二、理论教学内容及基本要求

1 Android 操作系统 本章主要对Android 的发展、特点、环境搭建和体系结构进行简要介绍。并且讲解了JDK、Eclipse、Android SDK 软件的下载及安装的基本知识。对Android 应用程序进行解析,提高读者对程序的创建、目录的结构、资源的管理以及对程序权限的理解。最后讲解如何调试Android 程序。 2 Android 生命周期与组件通信 本章主要讲述了Android 生命周期和组件之间的通信。生命周期主要讲述了Android四大组件之一的Activity 生命周期, 包括生命周期函数、栈结构和基本状态三方面。组件的通信靠Intent 实现, 以及Intent 基本构成。 3 Android 用户界面设计 本章主要从Android 用户界面开发出发, 讲述了开发过程中经常使用到的控件, 包括菜单、常用基础控件、对话框与消息框。界面中控件的结构及位置等需要通过有效的界面布局控制, Android 中提供了5 种界面布局格式, 即线性布局、相对布局、表格布局、绝对布局和框架布局。界面中还有一种必要的操作处理———外部操作的响应, 通过有效的事件机制完成。 4 Android 数据存储与交互 本章主要讲述了Android 数据存储与交互方面的内容, 系统中数据交互主要通过五种方式实现, 共享优先数据机制、SQLite 数据库、File 文件机制、内容提供器控件和网络存储。其中在应用程序中最常用也是最有效的数据交互方式是使用SQLite 数据库。 5 Android 后台服务与事件广播 本章主要讲述了Android 后台服务、事件广播和常驻程序。后台服务由系统提供的Service 组件实现, 可分为本地服务和远程服务。事件广播机制主要依靠BroadCast Reciver 组件实现。常驻程序AppWidget又称为窗口小部件, 是在HomeScreen上显示的小部件, 开发时常用AppWidgetProvider 和AppWidgetProviderInfo 类实现。 6 媒介与网络 本章介绍了Android 平台下通过程序实现音频、视频播放等操作。分别介绍了从源文件播放、文件系统播放和流媒体播放等方式。并且介绍了Android 图形绘制与特效, 包括图形的平移、旋转及缩放等操作, 保存指定格式图形文件。编写专业的绘图或控制图形动画的应用程序。以及如何使用Android 手机中内置的高性能WebKit 内核浏览器浏览网页, 使用HTTP 和URL 获得网络资源等内容。 7 Android NDK 本章介绍了Android NDK 的相关知识, 从NDK 的简单介绍到开发环境的

(带答案)Android复习资料

选择题 1. 下面不是Android四大组件之一的(B ) A. Activity B.Intent C. Service D. ContentProvider 2. 下面关于广播叙述错误的是(A) A. 广播是Android四大组件之一 B. BroadcastReceiver有两种注册方式,静态注册和动态注册 C. 静态注册需要在Mainfest.xml中配置 D. 动态注册需要在应用退出时候接触广播的注册。 3. 下面关于BroadcastReceiver错误的是(B): A. BroadcastReceiver有两种注册方式,静态注册和动态注册。 B. BroadcastReceiver必须在AndroidMainfest文件中声明 C. BroadcastReceiver的使用,一定有一方发送广播,有一方监听注册广播,onReceive方法才会被调用。 D. 广播发送的Intent都是隐式启动。 4. 下面关于谁先接收广播顺序错误的是(B) A. 有序广播,优先级高的先接收 B. 有序广播,同优先级的动静态广播接收器,静态优先于动态。 C. 有序广播,同优先级的动态广播接收器,先注册的大于后注册的。 D. 普通广播时,无视优先级,动态广播接收器优先于静态广播接收器 5. 下面关于广播说法错误的是(B) A. 广播分为有序广播和无序广播 B. 使用abortBroadcast方法可以中断所有广播的传递。 C. 广播注册方式分为动态和静态

D. sendOrderBroadcast用来向系统广播有序事件,sendBroadcast()是用来广播无序事件。 6. 下列关于Intent启动组件说法错误的是(C) A.startActivity( ) B. startService( ) C. startBroadcastReceiver() D.startActivityForResult() 7. 对于广播的发送,Intent的启动方式是(B) A.显式启动 B. 隐式启动 C. A和B都可以 D. 以上说法都不正确。 8. 下面关于Notification的说法正确的是(D): A. NotificationManager man = new NotificationManager(); B. PendingIntent contentIntent= new PendingIntent(); C. RemoteViews contentView = new RemoteViews(); D. Notification notification = new Notification(); 9. 关于ContenValues类说法正确的是( A ) A、他和Hashtable比较类似,也是负责存储一些名值对,但是他存储的名值对当中的 名是String类型,而值都是基本类型 B、他和Hashtable比较类似,也是负责存储一些名值对,但是他存储的名值对当中的 名是任意类型,而值都是基本类型 C、他和Hashtable比较类似,也是负责存储一些名值对,但是他存储的名值对当中的 名,可以为空,而值都是String类型 D、他和Hashtable比较类似,也是负责存储一些名值对,但是他存储的名值对当中的名是String类型,而值也是String类型 10.在手机开发中常用的数据库是(A) A,SQLite3 B,Oracle C,Sql Server D,Db23

Android基础应用课程标准

《Android基础》课程标准 一、课程定位 本课程是计算机专业基于Java方向的Android应用层程序开发的一门专业核心课程。作为Java程序设计、数据库原理与应用等课程的后续课程,主要在于培养学生应用Android技术进行Android应用程序开发的能力,并培养其良好的编程规范和职业习惯。 二、课程目标 通过案例驱动的学习和综合训练,熟练掌握Android应用程序开发的基本知识和技能,并能结合Android中的常用控件和四大系统组件进行Android应用程序的开发,并为后续Android高级知识的学习做下铺垫。在课程的学习中,培养诚实、守信、坚韧不拔的性格,培养善于沟通表达、善于自我学习、具备团队协作的能力。并养成规范的编码、按时交付软件等良好的工作态度。 (一)知识目标 1.掌握Android开发环境的搭建;熟悉Android应用的基本框架,了解Activity、layout的关系; 2.指导学生进行需求分析报告的拟定以及实训报告的编写; 3.熟练掌握Android常用的UI组件的用法,熟练使用Android的UI组件来搭建用户界面;掌握Android 中用户事件处理的基本方法; 4.掌握APP系统分层架构的搭建; 5.熟练掌握AdapterView相关UI组件以及Adapter模式、常见Adapter的定义; 6.熟悉Activity、Service和BroadcastReceiver的生命周期方法,熟练掌握它们的用法 7.熟悉Intent的用法,熟练使用Intent的诸多属性用途及用法; 8.熟练掌握Service与广播机制的使用和工作原理,为应用开发打下基础; 9.掌握SQLite的语法,熟练掌握Android SQLite 数据库的使用。能够用多种方式实现数据存储和数据 共享; 10.掌握Android的异步加载机制; 11.了解自定义控件的实现原理并掌握自定义技巧。 12.了解Android应用程序的屏幕适配、国际化方式及APP上架流程和盈利方式。 (二)职业能力目标

Android复习练习题

一、单选题 退出activity对一些资源以及状态的操作保存,可以在生命周期 的哪个函数中进行( A ) A、onPause() B、onCreate() C、onResume() D、onStart() Android项目工程下面的assets目录的作用是什么( B ) A、放置应用到的图片资源。Res/drawable B、主要放置一些文件资源,这些文件会被原封不动打包到apk里面 C、放置字符串,颜色,数组等常量数据res/values D、放置一些与UI相应的布局文件,都是xml文件res/layout 下列不属于android布局的是( C ) A、FrameLayout B、LinearLayout C、BorderLayout D、TableLayout E、RelativeLayout Intent的作用的是( A ) A、intent是连接四大组件的纽带,可以实现界面间切换,可以包含动作和动作数据; B、是一段长的生命周期,没有用户界面的程序,可以保持应用在后台运行,而不会因为切换页面而消失service C、实现应用程序间的数据共享contentprovider D、处理一个应用程序整体性的工作 下列哪个是AbsoluteLayout中特有的属性( B ) A、android:layout_height B、android:layout_x C、android:layout_above D、android:layout_toRightOf RatingBar组件中不能用属性直接设置的是( D) A、五角星个数 B、当前分数 C、分数的增量 D、五角星的色彩 在手机开发中常用的数据库是( A ) A、,sqlLite B、Oracle C、SqlServer D、Db23 关于BroadcastReceiver的说法不正确的是( B ) A)是用来接收广播Intent的 B),一个广播Intent只能被一个订阅了此广播的BroadcastReceiver所接收 C)对有序广播,系统会根据接收者声明的优先级别按顺序逐个执行接收者 D)接收者声明的优先级别在的android:priority属性中声明,数值越大优先级别越高 使用MediaPlayer播放保存在sdcard上的mp3文件时( C ) A)需要使用方法创建MediaPlayer B)直接newMediaPlayer即可 C)需要调用setDataSource方法设置文件源D)直接调用start方法,无需设置文件源在android中使用RadioButton时,要想实现互斥的选择需要用的组件是(D ) A)ButtonGroup B)RadioButtons C)CheckBox D)RadioGroup 在多个应用中读取共享存储数据时,需要用到的query方法,是哪个对象的方法( A ) A)ContentResolver B)ContentProvider C)Cursor D)SQLiteHelper DDMS中Log信息分为几个级别( C ) A)3 B)4 C)5D)6 能够自动完成输入内容的组件是( D )

Android复习练习题

一、单选题 退出 activity 对一些资源以及状态的操作保存,可以在生命周期 的哪个函数中进行( A ) A、onPause() B、onCreate() C、onResume() D、onStart() Android 项目工程下面的 assets 目录的作用是什么 ( B ) A、放置应用到的图片资源。 Res/drawable B、主要放置一些文件资源,这些文件会被原封不动打包到 apk 里面 C、放置字符串,颜色,数组等常量数据 res/values D、放置一些与 UI 相应的布局文件,都是 xml 文件 res/layout 下列不属于android布局的是( C ) A、FrameLayout B、LinearLayout C、BorderLayout D、TableLayout E、RelativeLayout Intent 的作用的是 ( A ) A、intent是连接四大组件的纽带,可以实现界面间切换,可以包含动作和动作数据; B、是一段长的生命周期,没有用户界面的程序,可以保持应用在后台运行,而不会因为切换页面而消失 service C、实现应用程序间的数据共享 contentprovider D、处理一个应用程序整体性的工作 下列哪个是AbsoluteLayout中特有的属性 ( B ) A、android:layout_height B、android:layout_x C、android:layout_above D、android:layout_toRightOf RatingBar组件中不能用属性直接设置的是( D) A、五角星个数 B、当前分数 C、分数的增量 D、五角星的色彩 在手机开发中常用的数据库是( A ) A、,sqlLite B、Oracle C、Sql Server D、Db23 关于BroadcastReceiver的说法不正确的是( B ) A)是用来接收广播Intent的 B),一个广播Intent只能被一个订阅了此广播的BroadcastReceiver所接收 C)对有序广播,系统会根据接收者声明的优先级别按顺序逐个执行接收者 D)接收者声明的优先级别在的android:priority属性中声明,数值越大优先级别越高 使用MediaPlayer播放保存在sdcard上的mp3文件时( C ) A)需要使用MediaPlayer.create方法创建MediaPlayer B)直接newMediaPlayer即可C)需要调用setDataSource方法设置文件源D)直接调用start方法,无需设置文件源在android中使用RadioButton时,要想实现互斥的选择需要用的组件是(D ) A)ButtonGroup B) RadioButtons C)CheckBox D)RadioGroup 在多个应用中读取共享存储数据时,需要用到的query方法,是哪个对象的方法?( A ) A)ContentResolver B)ContentProvider C)Cursor D)SQLiteHelper DDMS中Log信息分为几个级别( C ) A)3 B)4 C)5 D)6 能够自动完成输入内容的组件是( D )

Android应用开发经典面试题

Android应用开发经典面试题 1、Android的四大组件是哪些,它们的作用? 答:Activity:Activity是Android程序与用户交互的窗口,是Android构造块中最基本的一种,它需要为保持各界面的状态,做很多持久化的事情,妥善管理生命周期以及一些跳转逻辑 service:后台服务于Activity,封装有一个完整的功能逻辑实现,接受上层指令,完成相 关的食物,定义好需要接受的Intent提供同步和异步的接口 Content Provider:是Android提供的第三方应用数据的访问方案,可以派生Content Provider类,对外提供数据,可以像数据库一样进行选择排序,屏蔽内部数据的存储细节,向外提供统一的借口模型,大大简化上层应用,对数据的整合提供了更方便的途径 BroadCast Receiver:接受一种或者多种Intent作触发事件,接受相关消息,做一些简单 处理,转换成一条Notification,统一了Android的事件广播模型 2、请介绍下Android中常用的五种布局。 常用五种布局方式,分别是:FrameLayout(框架布局),LinearLayout(线性布局),AbsoluteLayout(绝对布局),RelativeLayout(相对布局),TableLayout(表格布局)。 一、FrameLayout:所有东西依次都放在左上角,会重叠,这个布局比较简单,也只能放 一点比较简单的东西。 二、LinearLayout:线性布局,每一个LinearLayout里面又可分为垂直布局 (android:orientation=”vertical”)和水平布局(android:orientation=”horizontal”)。当垂直布局时,每一行就只有一个元素,多个元素依次垂直往下;水平布局时,只有一行,每一个元素依次向右排列。 三、AbsoluteLayout:绝对布局用X,Y坐标来指定元素的位置,这种布局方式也比较简单,但是在屏幕旋转时,往往会出问题,而且多个元素的时候,计算比较麻烦。 四、RelativeLayout:相对布局可以理解为某一个元素为参照物,来定位的布局方式。主 要属性有:相对于某一个元素android:layout_below、android:layout_toLeftOf相对于父 元素的地方android:layout_alignParentLeft、android:layout_alignParentRigh;五、TableLayout:表格布局,每一个TableLayout里面有表格行TableRow,TableRow里面可以具体定义每一个元素。每一个布局都有自己适合的方式,这五个布局元素可以相互嵌套应用,做出美观的界面。

Android四大组件的详细讲解

Android应用程序由一些零散的有联系的组件组成,通过一个工程manifest绑定在一起。在manifest中,描述了每一个组件以及组件的作用,其中有6个组件,它们是Android 应用程序的基石: Activities(活动)应用程序的显示层。每一个画面对应于你的应用程序,将会是Activity类的扩展。Activity使用Views去构建UI来显示信息和响应用户的行为。就桌面开发而言,一个Activity相当于一张Form。你在这章中将会学习到更多关于Activities。 Services(服务)Android应用程序中不可见的“工人”。Service组件运行时不可见,但它负责更新的数据源和可见的Activity,以及触发通知。它们常用来执行一些需要持续运行的处理,当你的Activity已经不处于激活状态或不可见。你将在第8章学习怎样创建Service。 Content(内容)提供共享的数据存储。Content Provider(内容提供器)用来管理和共享应用程序的数据库。在应用程序间,Content Provider是共享数据的首选方式。这意味着,你可以配置自己的Content Provider去存取其他的应用程序或者通过其他应用程序暴露的Content Provider去存取它们的数据。Android设备本身包含了几个Content Provider来访问像联系人信息等有用的数据库。你将在第6章学习怎样创建和使用Content Provider。 Intents(意图)简单的消息传递框架。使用Intent,你可以在整个系统内广播消息或者给特定的Activity或者服务来执行你的行为意图。系统会决定那个(些)目标来执行适当的行为。 Broadcast Receivers(广播接收器)Intent广播的“消费者”。通过创建和注册一个Broadcast Receiver,应用程序可以监听符合特定条件的广播的Intent。Broadcast Receiver 会自动的启动你的Android应用程序去响应新来的Intent。Broadcast Receiver是事件驱动程序的理想手段。 Notifications(通知)用户通知的框架。Notification用来在不需要焦点或不中断它们当前Activity的情况下提示用户。它们是Service或Broadcast Receiver获得用户注意的首选方式。例如,当设备收到文本信息或外部来电时,它通过闪光,发声,显示图标或显示对话框信息来提醒你。在第8章里,你可以使用Notification来触发这些事件。 一、Activity详解 Activty的生命周期的也就是它所在进程的生命周期。

Android选择题集锦

下面关于Android dvm的进程和Linux的进程,应用程序的进程说法正确的是? 选择一项: a. DVM指dalivk的虚拟机.每一个Android应用程序都在它自己的进程中运行,不一定拥有一个独立的Dalvik虚拟机实例.而每一个DVM都是在Linux中的一个进程,所以说可以认为是同一个概念. b. DVM指dalivk的虚拟机.每一个Android应用程序都在它自己的进程中运行,不一定拥有一个独立的Dalvik虚拟机实例.而每一个DVM不一定都是在Linux 中的一个进程,所以说不是一个概念. c. DVM指dalivk的虚拟机.每一个Android应用程序都在它自己的进程中运行,都拥有一个独立的Dalvik 虚拟机实例.而每一个DVM 不一定都是在Linux 中的一个进程,所以说不是一个概念. d. DVM指dalivk的虚拟机.每一个Android应用程序都在它自己的进程中运行,都拥有一个独立的Dalvik虚拟机实例.而每一个DVM都是在Linux 中的一个进程,所以说可以认为是同一个概念. 题目2 下列选项哪个不是Activity启动的方法? a. goToActivity b. startActivity c. startActivityFromChild d. startActivityForResult 题目3 解析xml 的方式有() a. 字符器类型 b. 流方式 c. dom d. SAX 题目4 下列哪一个不属于Activity的生命周期方法? a. onInit( ) b. onStart( ) c. onStop( ) d. onPause( )

ANDROID应用开发试题

Android应用开发试题 一、选择题(每题2分,共30分) 1.下列不是手机操作系统的是?()D A.Android B.Window Mobile C.Apple IPhone IOS D.windows vista 2.Android的VM虚拟机是哪个?A A.Dalvik B.JVM C.KVM D.framework 3.AndroidVM虚拟机中运行的文件的后缀名为()C A.class B.apk C.dex D.xml 4.下列选项是Activity启动的方法有()ACD A.startActivity B.goToActivity C.startActivityForResult D.startActivityFromChild 5.下列哪个可做EditText编辑框的提示信息?()D A.android:inputType B.android:text C.android:digits D.android:hint 6.关于Activity的描述,下面哪个是错误的?AD A.一个Android程序中只能拥有一个Activity类 B.Activity类都必须在Androidmaniefest.xml中进行声明 C.系统完全控制Activity的整个生命周期 D.Activity类必须重载onCreate方法 7.关于widget(组件)属性的写法,下面哪个是正确的?ABC A.android:id=”@+id/tv_username” B.android:layout_width=”100px” C.android:src=”@drawable/icon” D.android:id="@id/tabhost" 8.下面哪个不是Android SDK中的ViewGroup(视图容器)?D A.LinearLayout B.ListView C.GridView D.Button 9.下列哪个不是Activity的生命周期方法之一?()B A.onCreate B.startActivity C.onStart D.onResume 10.MediaPlayer对象从停止状态到播放状态调用的方法是()AB A.prepare() B.start() C.reset() D.release() 11.下面说法错误的是()BC A.Android采用单线程模型 B.Android会默认会为线程创建一个关联的消息队列 C.Handler会与多个线程以及该线程的消息队列对应 D.程序组件首先通过Handler把消息传送给Looper,Looper把消息放入队列12.android中下列属于Intent的作用的是()C A实现应用程序间的数据共享 B是一段长的生命周期,没有用户界面的程序,可以保持应用在后台运行,而不会因为切换页面而消失 C可以实现界面间的切换,可以包含动作和动作数据,连接四大组件的纽带D处理一个应用程序整体性的工作 13.关于应用程序的生命周期,一个Activity从启动到运行状态需要执行3个方

android面试题目--答案

Android笔试题 一、选择题 1. 对一些资源以及状态的操作保存,最好是保存在生命周期的哪个函数中进行 (d) A、onPause() B、onCreate() C、 onResume() D、onStart() 2. android 中下列属于Intent的作用的是(c) A、实现应用程序间的数据共享 B、是一段长的生命周期,没有用户界面的程序,可以保持应用在后台运行,而不会因为切换页面而消失 C、可以实现界面间的切换,可以包含动作和动作数据,连接四大组件的纽带 D、处理一个应用程序整体性的工作 3. 下面的对自定style的方式正确的是(a) A、 B、 C、 fill_parent D、 4. android 关于service生命周期的onCreate()和onStart()说确的是(ad)(多选题) A、当第一次启动的时候先后调用onCreate()和onStart()方法 B、当第一次启动的时候只会调用onCreate()方法 C、如果service已经启动,将先后调用onCreate()和onStart()方法 D、如果service已经启动,只会执行onStart()方法,不在执行onCreate()方法 5. Android项目工程下面的assets目录的作用是什么b A、放置应用到的图片资源。 B、主要放置多媒体等数据文件 C、放置字符串,颜色,数组等常量数据 D、放置一些与UI相应的布局文件,都是xml文件

Android期末考试复习试卷(仅供参考)

一、选择题(20分,每小题2分) 1、下列不是手机操作系统的是( D )。 A Android B Window Mobile C Apple IPhone IOS D Windows Vista 2、下列选项哪个不是Activity 启动的方法(B ) A startActivity B goToActivity C startActivityForResult D startActivityFromChild 3、下列哪个不是Activity 的生命周期方法之一(B ) A onCreate B startActivity C onStart D onResume 4、下列哪个可做Android 数据存储(A ) A SQlite B M ySql C Oracle D DB2 5、下列哪个可做EditText编辑框的提示信息( D ) A android:inputType B android:text C android:digits D android:hint 6、Math.ceil(99.1) 的结果是(B ) A 99 B 100 C 99.1 D 99.0 7、android 中下列属于Intent的作用的是(C) A实现应用程序间的数据共享 B是一段长的生命周期,没有用户界面的程序,可以保持应用在后台运行,而不会因为切换页面而消失 C可以实现界面间的切换,可以包含动作和动作数据,连接四大组件的纽带 D处理一个应用程序整体性的工作 8、关于res/raw 目录说法正确的是A A这里的文件是原封不动的存储到设备上不会转换为二进制的格式 B这里的文件是原封不动的存储到设备上会转换为二进制的格式 C这里的文件最终以二进制的格式存储到指定的包中 D这里的文件最终不会以二进制的格式存储到指定的包中 9、Math.round(11.5)等于多少(). Math.round(-11.5)等于多少( C) A 11 ,-11 B 11 ,-12 C 12 ,-11 D 12 ,-12 10、我们都知道Hanlder是线程与Activity通信的桥梁,如果线程处理不当,你的机器就会变得越慢,那么线程销毁的方法是(A ) A onDestroy() B onClear() C onFinish() D onStop() 二、填空题(10 分,共10 题,每空1 分) 1、为了使android 适应不同分辨率机型,布局时字体单位应用( sp ),像素 单位应用( sp )和(dip ) 2、定义LinearLayout 水平方向布局时至少设置的三个属性:( android:orientation),(android:layout width)和(android:layout height) 3、layout 布局文件的命名不能出现字母(大写)

Android四大组件的ContentProvider实例——获取联系人

Android四大组件的ContentProvider实例——获取联系人 1.ContentProvider简述 ContenttProvider(以下简称CP)是为了获取不同应用之间的数据而诞生的组件,并且官方为常见的一些数据提供了默认的CP。例如,联系人、短信等。 CP的几点关键: Uri:是CP的标志符,是识别CP的唯一方式。 ContentResolver:对CP进行操作的类。 权限:有时候操作一些地方需要一些权限。 2.获取联系人实现思路

3.具体实现3.1 申请权限

android6.0不仅要在AndroidManifest.xml中静态申请,还需要在代码中进行动态申请。 静态申请 在AndroidManifest.xml中进行申请。 动态申请 动态申请的流程为:发起申请和申请结果。 发起申请: 主要使用requestPermissions(permission名字的数组,整型的自定义reques code)方法 注: 什么时候进行动态申请呢?版本大于等于6.0且当前页面没有这个权限。

request code 为自定义数值,例子中我定义了一个常量 int--PERMISSIONS_REQUEST_READ_CONTACTS,这个是为了在查看申请结果时判定用的。 private void showContacts() { //检验是否版本大于6.0,当前页面是否有这个权限 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M &&checkSelfPermission(Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) { //发起申请 requestPermissions(new String[]{Manifest.permission.READ_CONTACTS}, PERMISSIONS_REQUEST_READ_CONTACTS); } else { //低版本直接运行,跳过动态申请。 readContacts(); } } 申请结果 重写onRequsetPermissionResult(int requestCode,String[] permissions,int[] grantResults)方法。

A03_a_Android应用框架的四大组件

A03_a_Android應用框架的四大組件?4個嫡系基類: Activity Service BroadcastReceiver ContentProvider Android母框架裡提供了4個一等公民(或稱為嫡系)的基類,包括: ●Activity: 處理UI互動的事情 ●Service:幕後服務(如硬件及Driver的服務) ●BroadcastReceiver: 接收訊息及事件處理 ●ContentProvider: 儲存共用資料 如下圖所示: 圖1 Android 框架裡的4個嫡系基類 基於這些基類,地頭蛇就可以撰寫AP子類,如下圖:

圖2 平台與應用兩種知識的結合 這4種應用子類都是由Android框架來負責創建(Create or New)其對象(Object)的。不過有趣的是: ●平台框架基類寫在先 ●應用子類寫在後 那麼框架事先又如何知道應用開發者後來撰寫的應用子類的名稱呢? 如果不知道應用子類的名稱,又如何創建應用子類的對象呢? 答案是:依賴AndroidManifest.xml文檔。例如: // AndroidManifest.xml

Android四大组件——Service后台服务、前台服务、IntentService、跨进程服务、无障碍服务、系统服务

Android四大组件——Service后台服务、前台服务、IntentService、跨进程服务、无障碍服务、系统服务 Service简介 Service是Android中实现程序后台运行的解决方案,它非常适用于去执行那些不需要和用户交互而且还要求长期运行的任务。Service默认并不会运行在子线程中,它也不运行在一个独立的进程中,它同样执行在UI线程中,因此,不要在Service中执行耗时的操作,除非你在Service中创建了子线程来完成耗时操作 Service的运行不依赖于任何用户界面,即使程序被切换到后台或者用户打开另一个应用程序,Service仍然能够保持正常运行,这也正是Service的使用场景。当某个应用程序进程被杀掉时,所有依赖于该进程的Service也会停止运行 后台服务 后台服务可交互性主要是体现在不同的启动服务方式,startService()和bindService()。bindService()可以返回一个代理对象,可调用Service中的方法和获取返回结果等操作,而startService()不行 不可交互的后台服务 不可交互的后台服务即是普通的Service,Service的生命周期很简单,分别为onCreate、onStartCommand、onDestroy这三个。当我们startService()的时候,首次创建Service会回调onCreate()方法,然后回调onStartCommand()方法,再次startService()的时候,就只会执行一次onStartCommand()。服务一旦开启后,我们就需要通过stopService()方法或者stopSelf()方法,就能把服务关闭,这时就会回调onDestroy() 一、创建服务类 创建一个服务非常简单,只要继承Service,并实现onBind()方法 public class BackGroupService extends Service { /** * 綁定服务时调用 * * @param intent * @return */ @Nullable

AnjoyoAndroid07课后习题

AnjoyoAndroid07课后习题 一、选择题: 1.下面关于Service的描述有误的一项是()。 A、Service运行在主线程中,可以执行各种后台操作,比如数据计算、多媒体播放、下 载文件等等。 B、Service是不提供用户界面而在后台完成各种耗时操作的组件,译为“服务”。 C、Service与Activity一样,也是Android的四大组件之一,与Activity相同,也使用 Intent对象激活Service。 D、Service、Intent、Activity和ContentProvider被并称为Android的四大组件。 2.下面关于Service的说法不正确的一项是()。 A、Service是Android系统的后台服务组件,适用于开发无界面、长时间运行的应用功 能。 B、Activity比Service的优先级高,不会轻易被Android系统终止。 C、应用程序组件可以启动一个服务(Start a Service),即使用户切换到另一个应用程 序,它仍然会继续在后台运行。 D、一个组件还可以绑定到一个与它进行交互、甚至进行进程间通信(IPC)的服务(Bind a Service),比如处理网络交易、播放音乐、执行文件I / O操作的服务。 3.下列关于Service说法错误的一项是()。 A、Android中,Service有两种不同的使用方式,一种是以启动方式使用Service(Started Service),另一种是以绑定方式使用Service(Bound Service)。 B、需要在AndroidManifest.xml文件中注册,否则,Service根本无法启动。 C、以绑定方式使用Service,能够获取到Service对象,不仅能够正常启动Service,而 且能够调用正在运行中的Service实现的私有方法和属性。 D、为了使Service支持绑定,需要在Service类中重写onBind()方法,并在onBind()方 法中返回Service对象。 4.下列关于Service绑定说法有误的一项是()。 A、如果绑定成功,则会通过getService()获取Service对象,这样便可以调用Service中 的方法和属性。 B、如果绑定意外失败,会将Service对象设置为null,表示绑定意外失效,Service实 例不再可用。 C、绑定一个Service就可以开启并使一个Service处于运行状态。 D、以绑定方式使用Service时,调用者需要声明一个ServiceConnnection对象,但可以 不用重写它的onServiceConnected()和onServiceDisconnected()方法。 5.下面关于Service描述错误的一项是()。 A、取消绑定仅需要使用unbindService()方法,并将ServiceConnnection对象传递给 unbindService()方法即可。 B、以启动方式使用Service时,使用startService()方法的目的是回调onStart()方法。 C、以绑定方式使用Service时,使用bindService()方法的目的是回调onBind()方法,它 的作用是在Service和调用者之间建立一个桥梁。 D、一般会把要在应用程序被关闭后仍然需要执行的操作实现为一个绑定式的Service, 而将一些执行特定功能、执行周期短或在应用程序关闭后将要停止的操作实现为启动式

相关主题
相关文档
最新文档