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

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的步骤

  1. 创建需要启动的BroadcastReceiver的Intent
  2. 调用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呢?

  1. 定义自己的ContentProvider类,该类需要继承Android提供的ContentProvider基类。
  2. 在Androidmanifest.xml文件中注册这个ContentProvider,注册时也需要为它绑定一个Uri

猜你喜欢

转载自blog.csdn.net/STU17xkx/article/details/80953545