《了解Android四大组件 》的补充

xiaoxiao2021-02-28  51

Activity

View组件是所有UI控件、容器控件的基类,View组件就是Android应用中用户实实在在看到的部分。但View组件需要放到容器组件中,或者使用Activity将它显示出来。如果需要通过某个Activity把指定的View显示出来,调用Activity的setContentView()方法即可。

接受一个View对象作为参数 如: LinearLayout layout = new LinearLayout(this); setContentView(layout); 接受一个布局管理资源的ID作为参数 如: setContentView(R.layout.main);

其他知识,在《了解Android四大组件》中,有详细完整的讲解,并已经亲测


Service

关于Activity和Service的选择标准的一些事: 如果某个程序组件需要在运行时向用户呈现某种界面,或者该程序需要与用户交互,就需要使用Activity;否则就应该考虑使用Service

动手试试看

创建、配置Service 就如activity一样,对于Service的开发也需要两个步骤:

定义一个继承Service的子类在AndroidManifest.xml文件中配置该Service

具体的需要被覆盖的主要方法的详解在《了解Android四大组件中》,在这里直接上源码:

import android.app.Service; import android.content.Intent; import android.os.IBinder; public class FirstService extends Service { // 必须实现的方法 @Override public IBinder onBind(Intent arg0) { return null; } // Service被创建时回调该方法 @Override public void onCreate() { super.onCreate(); System.out.println("Service is Created"); } // Service被启动时回调该方法 @Override public int onStartCommand(Intent intent, int flags, int startId) { System.out.println("Service is Started"); return START_STICKY; } // Service被关闭之前回调 @Override public void onDestroy() { super.onDestroy(); System.out.println("Service is Destroyed"); } }

在AndroidManifest.xml文件中增加如下配置片段来配置Service:

<service android:name=".FirstService"> </service> 与配置Activity相似,配置Service时也可为<service.../>元素 配置<intent-filter.../>子元素, 用于说明该Service可被那些Intent启动

启动和停止Service

import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.content.Intent; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; public class MainActivity extends AppCompatActivity { Button start, stop; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 获取程序界面中的start、stop两个按钮 start = (Button) findViewById(R.id.start); stop = (Button) findViewById(R.id.stop); // 创建启动Service的Intent final Intent intent = new Intent(this , FirstService.class); start.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { // 启动指定Service的关键就是调用Context里定义的startService startService(intent); } }); stop.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { // 停止指定Service关键就是调用Context里定义的stopService stopService(intent); } }); } }

效果演示:(Logcat)

当按下“START”按钮时:

当按下”STOP”按钮时:

尝试连按三下“START”

我们可以发现,我们成功实现了FirstService中的被覆盖的方法,并打印出想要的字,有一点值得注意:在效果图三种,我们发现每次Service被启动时都会回调onStratCommond()方法,但多次启动一个已有得Service组件将不会回调onCreat()方法。

虽然这个Service几乎什么都没干,只是打印了几行字而已,但是它是Service组件的框架,若想让这个Service多做一些事,只需要在被覆盖的onCreate() onStartCommand() onDestroy()的方法体中,实现相应的代码块即可


BroadcastReceiver

启动BroadcastReceiver的步骤

创建需要启动的BroadcastReceiver的Intent调用Context的sendBroadcast()或sendOrderedBroadcast()方法启动指定的BroadcastReceiver

与OnXxxListener的区别 OnXxxListener只是程序级别的监听器,这些监听器运行在指定程序所在进程中,当程序退出时,OnXxxListener监听器也就随之关闭了。 但BroadcastReceiver是系统级别的监听器,拥有自己的进程,只要存在与之匹配的Inten被广播出来,BroadcastReceiver就会被激发。

如何指定BroadcastReceiver能匹配的Intent

使用代码进行指定,调用BroadcastReceiver的Context的registerReceiver(BroadcastReceiver receiver,IntentFilter filter)方法指定。

在AndroidManifest.xml文件中配置。

**注意:**BroadcastReceiver的onReceive()方法不能再10秒内执行完成,Android会认为该程序无响应,故不要在此执行耗时的操作。(如果确实需要根据Broadcast来完成一项比较耗时的操作,则可以考虑通过Intent启动一个Service来完成该操作)

动手试试发送广播

首先在activity_main.xml中创建一个用于发送的按钮(基本操作,代码就不放上来了)。

import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.content.Intent; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; public class MainActivity extends AppCompatActivity { Button send; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 获取程序界面中的按钮 send = (Button) findViewById(R.id.send); send.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { /* *创建一个Intent对象,并使用该Intent对象对外发送一条广播 */ // 创建Intent对象 Intent intent = new Intent(); // 设置Intent的Action属性 intent.setAction("org.crazyit.action.CRAZY_BROADCAST"); intent.putExtra("msg", "简单的消息"); // 发送广播 sendBroadcast(intent); } }); } }

当符合该MyReceiver的广播出现时,该MyReceiver的onReceiver()方法将会被出发,从而在该方法中显示广播所携带的信息。

import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.widget.Toast; public class MyReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Toast.makeText(context, "接收到的Intent的Action为:" + intent.getAction() + "\n消息内容是:" + intent.getStringExtra("msg") , Toast.LENGTH_LONG).show(); } }

因为上面广播所用的Intent的Action为org.crazyit.action.CRAZY_BROADCAST,这就需要配置上面的BroadcastReceiver应监听Action为该字符串的Intent,在AndroidMainifest.xml文件中增加代码块

<receiver android:name=".MyReceiver"> <intent-filter> <!-- 指定该BroadcastReceiver所响应的Intent的Action --> <action android:name="org.crazyit.action.CRAZY_BROADCAST" /> </intent-filter> </receiver>

点击“send”Button按钮效果图:

这里演示的是用户发送的广播,需要明白BroadcastReceiver还有一个重要的用途:接受系统广播消息。 其他这里未写到的内容见《了解Android四大组件》一文。


ContentProvider

在《疯狂Android讲义》中,有如下类比帮助我们理解ContentProvider、ContentResolver两个核心API的作业。

把ContentProvider当做Android系统内部的“网站”,这个网站以固定的Uri对外提供服务;而ContentResolver则可当成Android系统内部的HttpClient,它可以向指定Uri发送“请求”(实际上是调用ContentResolver的方法),这种请求最后委托给ContentProvider处理,从而实现对“网站”(即ContentProvider)内部数据进行操作。

ContentProvider只有一个onCreate()生命周期方法——当其他应用通过ContentResolver第一次访问该ContentProvider时,onCreate()方法将会被回调,onCreate()方法只会被调用一次;ContentProvider提供的query(),insert(),update()和delete()方法则由其他应用通过ContentResolver调用

那如何开发一个ContentProvider呢?

定义自己的ContentProvider类,该类需要继承Android提供的ContentProvider基类。在Androidmanifest.xml文件中注册这个ContentProvider,注册时也需要为它绑定一个Uri
转载请注明原文地址: https://www.6miu.com/read-2623369.html

最新回复(0)