安卓四大组件

本文详细介绍了Android开发中的四大核心组件:Service、Broadcast Receiver、Activity及Content Provider的基本概念、使用方法和生命周期管理等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1,service

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


生命周期:首次启动时:Oncreat()>OnBind()>OnStartCommand()>OnStart()

  下次启动:OnStartCommand()>OnStart()

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

在AndroidManifest.xml添加:

<service android:name="com.example.administrator.demo_coordinatorlayout.demo.ServiceDemo">
    <intent-filter>
        <action android:name="com.example.administrator.demo_coordinatorlayout.ServiceDemo"/>
    </intent-filter>
</service>
ServiceDemo继承Service

public class ServiceDemo extends Service {
    private static final String TAG = "ServiceDemo";
    public static final String ACTION = "com.example.administrator.demo_coordinatorlayout.ServiceDemo";

    @Override
    public void onCreate() {
        Log.i("tag", "onCreate");
        super.onCreate();
    }

    @Override
    public IBinder onBind(Intent intent) {
        Log.i("tag", "onBind");
        return null;
    }

    @Override
    public void onStart(Intent intent, int startId) {
        Log.i("tag", "onStart");
        super.onStart(intent, startId);
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.i("tag", "onStartCommand");
        return super.onStartCommand(intent, flags, startId);
    }
}
Activity中的使用

public class WebActivity extends Activity {
    @InjectView(R.id.btn_service)
    Button btn;
    ServiceConnection conn;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.web_activity);
        ButterKnife.inject(this);
        conn=new ServiceConnection() {
            @Override
            public void onServiceConnected(ComponentName name, IBinder service) {
                Log.i("tag","onServiceConnected");
            }

            @Override
            public void onServiceDisconnected(ComponentName name) {
                Log.i("tag","onServiceConnected");
            }
        };
    }

    @OnClick({R.id.iv_back, R.id.btn_service})
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.iv_back:
                finish();
                break;
            case R.id.btn_service:
                bindService(new Intent(ServiceDemo.ACTION),conn,BIND_AUTO_CREATE);
                startService(new Intent(ServiceDemo.ACTION));
                break;
        }
    }
}

二,广播Broadcast Receiver

注册分为静态注册和动态注册

静态注册:

  1. <receiver android:name=".SMSReceiver">
  2.   <intent-filter>
  3.      <action android:name="android.provider.Telephony.SMS_RECEIVED" />
  4.   </intent-filter>
  5. </receiver>

动态注册:

IntentFilter filter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
ConnectionChangeReceiver myReceiver = new ConnectionChangeReceiver();
this.registerReceiver(myReceiver, filter);

发送广播

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

1.    new Intent with action name
  Intent intent = new Intent(String action);
  或者 只是new Intent, 然后
  intent.setAction(String action);


接收广播:判断网络状态(在销毁时记得解注)

public class ConnectionChangeReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo mobNetInfo = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
        NetworkInfo wifiNetInfo = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);

        if (!mobNetInfo.isConnected() && !wifiNetInfo.isConnected()) {
            Util.showToast(context,"网络已断开!");
        } else {
        }
    }
}

三,Activity

   生命周期以及各个生命周期能做什么

     一、 onCreate :当活动第一次启动的时候,触发该方法,可以在此时完成活动的初始化工作。 
             onCreate 方法有一个参数,该参数可以为空( null ),也可以是之前调用 onSaveInstanceState ()方法               保存的状态信息。
     二、  onStart :该方法的触发表示所属活动将被展现给用户。
     三、  onResume :当一个活动和用户发生交互的时候,触发该方法。
     四、  onPause :当一个正在前台运行的活动因为其他的活动需要前台运行而转入后台运行的时候,触发该方法。              这时候需要将活动的状态持久化,比如正在编辑的数据库记录等。
     五、  onStop :当一个活动不再需要展示给用户的时候,触发该方法。如果内存紧张,系统会直接结束这个活                  动,而不会触发 onStop 方法。 所以保存状态信息是应该在onPause时做,而不是onStop时做。活动如果没              有在前台运行,都将被停止或者Linux管理进程为了给新的活动预留足够的存储空间而随时结束这些活动。                因此对于开发者来说,在设计应用程序的时候,必须时刻牢记这一原则。在一些情况下,onPause方法或许              是活动触发的最后的方法,因此开发者需要在这个时候保存需要保存的信息。
      六、onRestart :当处于停止状态的活动需要再次展现给用户的时候,触发该方法。
      七、 onDestroy :当活动销毁的时候,触发该方法。和 onStop 方法一样,如果内存紧张,系统会直接结束这个            活动而不会触发该方法。
·     onSaveInstanceState :系统调用该方法,允许活动保存之前的状态,比如说在一串字符串中的光标所处的位置等。 
通常情况下,开发者不需要重写覆盖该方法,在默认的实现中,已经提供了自动保存活动所涉及到的用户界面组件的所有状态信息。

 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.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);

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
四,ContentProvider

 Android提供了一些主要数据类型的ContentProvider,比如音频、视频、图片和私人通讯录等。可在android.provider包下面找到一些Android提供的ContentProvider。通过获得这些ContentProvider可以查询它们包含的数据,当然前提是已获得适当的读取权限。

  主要方法:

  public boolean onCreate() 在创建ContentProvider时调用

  public Cursor query(Uri, String[], String, String[], String) 用于查询指定Uri的ContentProvider,返回一个Cursor

  public Uri insert(Uri, ContentValues) 用于添加数据到指定Uri的ContentProvider中

  public int update(Uri, ContentValues, String, String[]) 用于更新指定Uri的ContentProvider中的数据

  public int delete(Uri, String, String[]) 用于从指定Uri的ContentProvider中删除数据

  public String getType(Uri) 用于返回指定的Uri中的数据的MIME类型

  *如果操作的数据属于集合类型,那么MIME类型字符串应该以vnd.android.cursor.dir/开头。

  例如:要得到所有person记录的Uri为content://contacts/person,那么返回的MIME类型字符串为"vnd.android.cursor.dir/person"。

  *如果要操作的数据属于非集合类型数据,那么MIME类型字符串应该以vnd.android.cursor.item/开头。

  例如:要得到id为10的person记录的Uri为content://contacts/person/10,那么返回的MIME类型字符串应为"vnd.android.cursor.item/person"。

  2.ContentResolver

  当外部应用需要对ContentProvider中的数据进行添加、删除、修改和查询操作时,可以使用ContentResolver类来完成,要获取ContentResolver对象,可以使用Context提供的getContentResolver()方法。

  ContentResolver cr = getContentResolver();

  ContentResolver提供的方法和ContentProvider提供的方法对应的有以下几个方法。

  public Uri insert(Uri uri, ContentValues values) 用于添加数据到指定Uri的ContentProvider中。

  public int delete(Uri uri, String selection, String[] selectionArgs) 用于从指定Uri的ContentProvider中删除数据。

  public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) 用于更新指定Uri的ContentProvider中的数据。

  public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) 用于查询指定Uri的ContentProvider。



  3.Uri

  Uri指定了将要操作的ContentProvider,其实可以把一个Uri看作是一个网址,我们把Uri分为三部分。

  第一部分是"content://"。可以看作是网址中的"http://"。

  第二部分是主机名或authority,用于唯一标识这个ContentProvider,外部应用需要根据这个标识来找到它。可以看作是网址中的主机名,比如"blog.youkuaiyun.com"。

  第三部分是路径名,用来表示将要操作的数据。可以看作网址中细分的内容路径。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值