第四章 Android 四大应用组件

安卓的入门基础就是四大应用组件。分别是:Activity(活动),Service(服务),Content Provider(内容提供者),Broadcast Receiver(广播接收者)。一般在面试或者笔试的过程中,这些都是最基本的问题。一个应用里面会有很多个Activity,这个不同的Activity 分别具备不同的功能,指引用户进行下一步的操作。

1.Activity

1.1 Activity的介绍

Activity 是用户与屏幕进行交互执行电话,拍照,启动应用等操作。简单来说就是用户在操作的过程中,看到的画面。

1.2 Activity的跳转和销毁

每个Activity 都可以启动另一个Activity ,但是系统会自动在你启动另一个Activity的时候,将原有的Activity保存在栈中。栈遵循“先进后出,后进先出”的原则。当新的Activity启动的时候,旧的Activity会的推送到栈上,获取焦点。用户点击返回的时候,销毁当前的Activity,回到旧的Activity。还有一种情况,就是当你从A Activity跳转B Activity 的时候,要求你返回的时候不能返回到 A Activity ,而是返回到 A Activity 的再上一个Activity。系统这时候会提供 finish()方法,结束当前Activity。如图所示。

情况一
情况二

1.3 Activity 的创建和生命周期

在创建Activity的时候,你就必须要了解Activity 的生命周期,了解一个Activity从创建,到结束的过程。简记: CSRPSD(创始人盘丝洞),记不住自己打自己一巴掌

生命周期图

1.4 Activity 的声明

在上一节中,我们说到 AndroidManifest.xml 文件中,我们会指定其中的某一个Activity为“ 主Activity” ,也就是启动该App的时候,程序的入口。

<activity android:name=".MainActivity">
   <intent-filter>
      <action android:name="android.intent.action.MAIN" />
      <category android:name="android.intent.category.LAUNCHER" />
   </intent-filter>

 </activity>

<activity>这个标签必须自<application>这个标签中。 <intent-filter>标签是过滤器。<action>是声明标签 android:name="android.intent.action.MAIN" ,这就声明了 .MainActivity是主Activity,也就是程序的入口。<category>元素指定此 Activity 应列入系统的应用启动器内(以便用户启动该 Activity)。
只有一个Activity 具备上述的操作和 "LAUNCHER"这个类别。否则会报错

1.5 Activity 的启动

假如是 MainActivity 跳转到SingleActivity

1.5.1 显式启动

方式一:
    Intent intent = new Intent(MainActivity.this, SingleActivity .class);
    startActivity(intent);

方式二:
   Component component = new Component(this,SingleActivity .class);
  Intent intent = new Intent();
  intent.setComponent(component);
  startActivity(intent);

方式三:
    Intent intent = new Intent();
  intent.setclass(this,SingleActivity .class);
  startActivity(intent);


1.5.2 隐式跳转

1.5.2.1 隐式跳转之Action跳转

1.在 AndroidManifest.xml文件中注册

<activity android:name=".SignInActivity";   
     <intent-filter  
         <action android:name="customer_action_here"  />
     </intent-filter>  
 </activity>  

2.在java代码中调用

//创建一个隐式的 Intent 对象:Action 动作 
    Intent intent = new Intent();
//设置 Intent 的动作为清单中指定的action  
   intent.setAction("customer_action_here");
   startActivity(intent);

1.5.2.2 隐式跳转之Category跳转

1.在 AndroidManifest.xml文件中注册

<activity android:name=".SignInActivity" >  
    <intent-filter>  
        <action android:name="customer_action_here" />  
        <category android:name="customer_category_here" />  
    </intent-filter>  
</activity>  

2.在java代码中调用

//创建一个隐式的 Intent 对象:Category 类别  
Intent intent = new Intent();  
intent.setAction("customer_action_here");  
//添加与清单中相同的自定义category  
intent.addCategory("customer_category_here");  
startActivity(intent);  
1.5.2.3 隐式跳转之Data跳转

1.在 AndroidManifest.xml文件中注册

< activity android:name=".SignInActivity">  
    < intent-filter>  
        < category android:name="android.intent.category.DEFAULT" />  
        < data  
            android:scheme="content"  
            android:host="com.example.intentdemo"  
            android:port="8080"  
            android:pathPattern=".*pdf"  
            android:mimeType="text/plain"/>  
    < /intent-filter>  
< /activity> 

2.在java代码中调用

//创建一个隐式的 Intent 对象,方法四:Date 数据  
Intent intent = new Intent();  
Uri uri = Uri.parse("content://com.example.intentdemo:8080/abc.pdf");  
intent.setDataAndType(uri, "text/plain");  
startActivity(intent);  
1.5.2.4 拓展 隐式跳转之浏览网页
Uri  uri=new Uri ("www.baidu.com");
Intent intent = new Intent(Intent.ACTION_VIEW, uri);  
startActivity(intent); 

1.5.2.5 拓展 隐式跳转之调用地图

//打开地图查看经纬度  
Uri uri = Uri.parse("geo:38.899533,-77.036476");  
Intent intent = new Intent(Intent.ACTION_VIEW, uri);  
startActivity(intent); 

1.5.2.6 拓展 隐式跳转之调用电话拨号(不需要拨号权限)

Uri uri = Uri.parse("tel:10086");  
Intent intent = new Intent(Intent.ACTION_DIAL, uri);
startActivity(intent);  

1.5.2.7 拓展 隐式跳转之调用电话直接拨号(需要拨号权限)

Uri uri = Uri.parse("tel:15980665805");  
Intent intent = new Intent(Intent.ACTION_CALL, uri);//注意区别于上面的aciton  
startActivity(intent); 

1.5.2.8 拓展 隐式跳转之调用短信程序

Intent intent = new Intent(Intent.ACTION_VIEW);      
intent.putExtra("sms_body", "这里写短信内容");      
intent.setType("vnd.android-dir/mms-sms");      
startActivity(intent);  

//指定了接受者
Uri uri = Uri.parse("smsto:10086");//指定接收者  
Intent intent = new Intent(Intent.ACTION_SENDTO, uri);  
intent.putExtra("sms_body", "你这个黑心运营商");  
startActivity(intent);  

1.5.2.9 拓展 隐式跳转之调用邮件程序

Intent intent = new Intent(Intent.ACTION_SENDTO);   
intent.setData(Uri.parse("mailto:xxx@gmail.com"));   
intent.putExtra(Intent.EXTRA_SUBJECT, "这是标题");   
intent.putExtra(Intent.EXTRA_TEXT, "这是内容");   
startActivity(intent);  

1.5.2.10 拓展 隐式跳转之调用音乐播放器

Intent intent = new Intent(Intent.ACTION_VIEW);  
//Uri uri = Uri.parse("file:///sdcard/xiong_it.mp4");  
Uri uri = Uri.parse("file:///sdcard/xiong_it.mp3");  
intent.setDataAndType(uri, "audio/mp3");  
startActivity(intent);  

1.5.2.11 拓展 隐式跳转之调用视频播放器

Intent intent = new Intent(Intent.ACTION_VIEW);  
//Uri uri = Uri.parse("file:///sdcard/xiong_it.mp3");  
Uri uri = Uri.parse("file:///sdcard/xiong_it.mp4");  
intent.setDataAndType(uri, "video/mp4");  
startActivity(intent);  

1.5.2.12 拓展 隐式跳转之调用视频播放器

Intent intent = new Intent();   
intent.setAction(Intent.ACTION_WEB_SEARCH);   
intent.putExtra(SearchManager.QUERY, "android");   
startActivity(intent);  

2. Service 服务

2.1 Service 的介绍

Service 一个可以在后台执行长时间运行操作而不提供用户界面的应用组件。 Activity 是可以看见的而Service是不能看见的。服务可由其他应用组件启动,而且即使用户切换到其他应用,服务仍将在后台继续运行。 此外,组件可以绑定到服务,以与之进行交互,甚至是执行进程间通信 (IPC)。 例如,服务可以处理网络事务、播放音乐,执行文件 I/O 或与内容提供程序交互,而所有这一切均可在后台进行。

Service 不是单独的运行,默认情况下是运行在主程序中。

Service 存在价值虽然不如Activity那么明显,在执行一些耗时的操作的时候需要用到Service ,而主程序一般不执行耗时操作,这样会阻塞线程,所以必须重开一个子线程,再将子线程用于执行耗时操作。Service充当线程管理者的角色

2.2 Service的启动方式和生命周期

Service 的启动方式
1)、 Context.startService()
调用者与服务之间没有关联,即使调用者退出,服务仍可运行
2)、 Context.bindService()
调用者与服务绑定在一起,调用者一旦退出,服务也就终止

生命周期

2.3 Started Service总结:

1.Activity页面中需要startService(intent) 和 stopService(intent)两个方法来启动Service和停止Service;

  1. 继承于Service类的自定义子类——MyStartService类中,生命周期回调方法有:onCreate() 、onStartCommand() 、onDestroy();
  2. 如果停止服务,可以在Activity中调用stopService(intent),也可以intent到Service中执行stopSelf()方法;

4.执行停止服务方法,会回调Service生命周期中的onDestroy()方法;
5.如果希望关闭Activity窗体,服务也停止,那么在Activity的onDestroy()方法中执行stopService()方法。如果希望关闭窗体后,服务还继续,那么Activity的onDestroy()中不执行停止服务即可;
6.在StartService中不会回调onBind()方法;

  1. 在停止服务后,如果再次点击“播放”,可以重新启动StartService。

在实际使用的时候最后自定义一个类继承service.

3.Content Provider

我觉得将Content Provide 叫做内容提供者挺合适的。谈Content Provide的时候就必须套说说数据库了。数据库在Android 是私有的,这样你就不能随便拿我的数据了。数据的安全性就得到了保障,但是当你需要将自己数据库的数据提供给别的应用程序的时候,你该怎么办呢?这时候就需要Content Provider来实现了。其他的应用程序需要使用数据的时候,可以通过Content Resolve来操作Content Provider暴露出来的数据。
   一旦某个应用程序通过Content Provider暴露了自己的数据操作接口,那么不管该应用程序是否启动,其他应用程序都可以通过该接口来操作被暴露的内部数据,包括增加数据、删除数据、修改数据、查询数据等。
  虽然大部分使用Content Provider操作的数据都来自于数据库,但是也可以来自于文件、SharedPreferences、XML或网络等其他存储方式。

3.1 Content Provider的核心类

1、Content Provider:(A应用暴露数据)
● 一个程序可以通过实现一个Content Provider的抽象接口将自己的数据暴露出去;
● 外界根本看不到,也不用看到这个应用暴露的数据在应用当中是如何存储的,是用数据库存储还是用文件存储,还是通过网上获得,这些一切都不重要,重要的是外界可以通过这一套标准及统一的接口和程序里的数据打交道,可以读取程序的数据,也可以修改程序的数据。
2、Content Resolver:(操作A应用所暴露的数据)
● 外界的程序通过ContentResolver接口可以访问ContentProvider提供的数据;
● ContentResolver 可以理解成是HttpClient的作用。
3、 Uri:Uri是ContentResolver和ContentProvider进行数据交换的标识。
● 每个ContentProvider提供公共的URI来唯一标识其数据集。管理多个数据集的(多个表)的 ContentProvider 为每个数据集提供了单独的URI。
● Uri 的标准前缀:以“content://”作为前缀,这个是标准的前缀,表示该数据由 ContentProvider 管理。
● Uri 的authority部分:该部分是完整的类名。(使用小写形式)。
● Uri 的path部分(资源部分、数据部分): 用于决定哪类数据被请求。
● 被请求的特定记录的id值。如果请求不仅限于某个单条数据,该部分及其前面的斜线应该删除。
● 为了将一个字符串转换成Uri,Android中提供了Uri的parse()静态方法来实现。
【备注:】URI、URL、URN的区别:
● 首先,URI,是uniform resource identifier,统一资源标识符,用来唯一的标识一个资源。
● URL是uniform resource locator,统一资源定位器,它是一种具体的URI,即URL可以用来标识一个资源,而且还指明了如何locate这个资源。
● URN,uniform resource name,统一资源命名,是通过名字来标识资源,比如mailto:java-net@java.sun.com
也就是说,URI是以一种抽象的,高层次概念定义统一资源标识,而URL和URN则是具体的资源标识的方式。URL和URN都是一种URI。
总结一下:URL是一种具体的URI,它不仅唯一标识资源,而且还提供了定位该资源的信息。URI是一种语义上的抽象概念,可以是绝对的,也可以是相对的,而URL则必须提供足够的信息来定位,所以,是绝对的。

3.2 使用ContentResolver 操作数据的步骤:

1、调用Context的getContentResolver()方法获得ContentResolver 对象;
2、调用使用ContentResolver 的insert()、delete()、update()、query()方法操作数据。
● Uri insert(Uri uri, ContentValues values)
● int delete(Uri uri, String where, String[] whereArgs)
● int update(Uri uri, ContentValues values, String where, String[] whereArgs)
● Cursor query(Uri uri, String[] projection, String where, String[] whereArgs, String sortOrder)
参数解释:
String where:表示带有占位符的where子句组成的字符串;
String[] whereArgs:表示替换where参数中占位符后的数据组成的字符串数组;
String sortOrder:表示select语句中的order by子句组成的字符串;
String[] projection:表示select语句中需要查询的所有的字段组成的字符串数组。
ContentValues values:是由数据库中表字段和往该字段中放置的数据所组成的键值对对象。
【备注:】以上四个方法的参数分别是2、3、4、5个。

4.Broadcast 广播 或者 Broadcast Receiver 广播接收器

广播接收器,也被称为全局事件,或系统事件。
  当Android系统中任何程序有动作时,如果想通知其他程序,采用广播的方式进行传播是非常有效的。广播从理论上说,可以将一个动作传播给任意多个程序(当然,广播接收器的数量会收到系统限制)。
  在Android中,有一些操作完成以后,会发送广播,比如说发出一条短信,或打出一个电话,如果某个程序接收了这个广播,就会做相应的处理。这个广播跟我们传统意义中的电台广播有些相似之处。之所以叫做广播,就是因为它只负责“说”而不管你“听不听”,也就是不管你接收方如何处理。另外,广播可以被不只一个应用程序所接收,当然也可能不被任何应用程序所接收。
  广播机制最大的特点就是发送方并不关心接收方是否接到数据,也不关心接收方是如何处理数据的。
  Android中广播的是操作系统中产生的各种各样的事件。例如,收到一条短信就会产生一个收到短信息的事件。而Android操作系统一旦内部产生了这些事件,就会向所有的广播接收器对象来广播这些事件。

4.1 广播机制的三要素

Android广播机制包含三个基本要素:
1、广播(Broadcast) - 用于发送广播;
2、广播接收器(Broadcast Receiver) - 用于接收广播;
3、意图内容(Intent)-用于保存广播相关信息的媒介。
Broadcast是一种广泛运用的在应用程序之间传输信息的机制。而Broadcast Receiver是对发送出来的Broadcast进行过滤接受并响应的一类组件。

4.2 广播的生命周期:

1、广播接收器仅在它执行这个方法时处于活跃状态。当onReceive()返回后,它即为失活状态。
2、拥有一个活跃状态的广播接收器的进程被保护起来而不会被杀死,但仅拥有失活状态组件的进程则会在其它进程需要它所占有的内存的时候随时被杀掉。
3、如果响应一个广播信息需要很长的一段时间,一般会将其纳入一个衍生的线程中去完成,而不是在主线程内完成它,从而保证用户交互过程的流畅。广播接收程序的时间限制为10秒。

4.3 注册Broadcast Receiver的方法

Broadcast Receiver用于监听被广播的事件(Intent),为了达到这个目的,Broadcast Receiver必须进行注册,注册的方法有以下两种:
1、静态注册:
静态注册方式是在AndroidManifest.xml的application里面定义receiver并设置要接收的action。
如果在清单配置文件中配置了广播接收器,那么程序在安装后会自动注册广播接收器。
静态注册方式的特点:不管该应用程序是否处于活动状态,都会进行监听。

<receiver 
    android:name=".CallReceiver"
    android:enabled="true">
    <intent-filter >
        <action android:name="android.intent.action.PHONE_STATE"/>
    </intent-filter>
</receiver>

其中MyReceiver为继承Broadcast Receiver的类,重写了onReceiver方法,并在onReceiver方法中对广播进行处理。<intent-filter>标签设置过滤器,接收指定action广播。

2、动态注册:
动态注册方式是在activity里面调用当前上下文对象的registerReceiver() 方法 来注册,和静态的内容差不多。一个形参是receiver对象,另一个是IntentFilter对象。而IntentFilter构造方法的参数是要接收的action。
动态注册方式特点:在代码中进行注册后,当应用程序关闭后,就不再进行监听。

MyReceiver receiver = new MyReceiver();
//创建过滤器,并指定action,使之用于接收同action的广播
IntentFilter filter = new IntentFilter("android.intent.action.PHONE_STATE");
//注册广播接收器
registerReceiver(receiver, filter);

4.4 发送广播

// 指定广播目标Action
Intent intent = new Intent("MyReceiver_Action");
// 可通过Intent携带消息
intent.putExtra("msg", "发送广播");
// 发送广播消息
sendBroadcast(intent);

4.5、注销BroadcastReceiver:

1、一般在onStart中注册BroadcastReceiver,在onStop中取消BroadcastReceiver。
2、一个BroadcastReceiver 对象只有在被调用onReceive(Context, Intent)时才有效,当从该函数返回后,该对象就无效的了,结束生命周期。

//注销广播接收器
unregisterReceiver(receiver);

4.6 代码中的使用

4.6.1 拦截短信

  <receiver
            android:name=".MySmsReceiver"
            android:enabled="true"
            android:exported="true" >
            <intent-filter android:priority="1" >
                <action android:name="android.provider.Telephony.SMS_RECEIVED" >
                </action>
            </intent-filter>
        </receiver>
//Protocol Data Unit  (PDU:协议数据单元)
public void onReceive(Context context, Intent intent) {
        Log.i(TAG, "==来短信了");
        // 获取短信的具体信息:短信发送号码,短信内容,短信发送时间
        Bundle bundle = intent.getExtras();
        Object[] pdus = (Object[]) bundle.get("pdus");
        SmsMessage[] smsMessage = new SmsMessage[pdus.length];
        for (int i = 0; i < pdus.length; i++) {
            smsMessage[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);
        }
        String phoneNumber = smsMessage[0].getDisplayOriginatingAddress();
        StringBuilder sb = new StringBuilder();
        for (SmsMessage sms : smsMessage) {
            sb.append(sms.getDisplayMessageBody());
        }
        String content = sb.toString();
        Log.i(TAG, "==来短信了" + phoneNumber + ":" + content);
                abortBroadcast();

    }

4.6.2 、来去电监听:

public void onReceive(Context context, Intent intent) {
        Log.i(TAG, "==电话状态改变了");
        TelephonyManager manager = (TelephonyManager) context
                .getSystemService(Service.TELEPHONY_SERVICE);
        Bundle bundle = intent.getExtras();
        // String phoneNumber0 = bundle
        // .getString(TelephonyManager.EXTRA_INCOMING_NUMBER);
        phoneNumber = bundle.getString("incoming_number");
        prefs = context.getSharedPreferences("phonenumber",
                Context.MODE_PRIVATE);
        if (phoneNumber != null) {
            editor = prefs.edit();
            editor.putString("phoneNumber", phoneNumber);
            editor.commit();
        } else {
            phoneNumber = prefs.getString("phoneNumber", "");
        }
        int state = manager.getCallState();
        switch (state) {
        case TelephonyManager.CALL_STATE_RINGING:// 铃声响动
            Log.i(TAG, "==铃声响了" + phoneNumber);
            break;
        case TelephonyManager.CALL_STATE_OFFHOOK:// 电话接听
            Log.i(TAG, "==接听电话" + phoneNumber);
            break;
        case TelephonyManager.CALL_STATE_IDLE:// 挂电话了
            Log.i(TAG, "==电话挂了" + phoneNumber);
            break;
        default:
            break;
        }
    }
<receiver
            android:name=".MyPhoneReceiver"
            android:enabled="true"
            android:exported="true" >
            <intent-filter>
                <action android:name="android.intent.action.PHONE_STATE" >
                </action>
            </intent-filter>
        </receiver>

4.6.3 截获屏幕休眠与唤醒

public void onReceive(Context context, Intent intent) {
        if (Intent.ACTION_SCREEN_OFF.equals(intent.getAction())) {
            Log.i(TAG, "==屏幕休眠了");
        }
        if (Intent.ACTION_SCREEN_ON.equals(intent.getAction())) {
            Log.i(TAG, "==屏幕唤醒了");
        }
    }

【注册:】
ScreenOffOnReceiver myReceiver = new ScreenOffOnReceiver();
IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_SCREEN_OFF);
filter.addAction(Intent.ACTION_SCREEN_ON);
registerReceiver(myReceiver, filter);
【备注:】屏幕唤醒和休眠广播只能在代码中注册,如果在清单配置文件中注册将不起作用。

4.6.4 开机自动运行

    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context, "监听到开机了", Toast.LENGTH_LONG).show();
        Intent intent2 = new Intent(context, MainActivity.class);
        context.startActivity(intent2);
    }

        <receiver
            android:name=".LaunchReceiver"
            android:enabled="true"
            android:exported="true" >
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
            </intent-filter>
        </receiver>

4.6.5 手机电池当前电量

public void onReceive(Context context, Intent intent) {
        Toast.makeText(context, "电量降低 ", Toast.LENGTH_LONG).show();
    }
        <receiver
            android:name=".BatteryReceiver"
            android:enabled="true"
            android:exported="true" >
            <intent-filter>
                <action android:name="android.intent.action.BATTERY_LOW" >
                </action>
            </intent-filter>
        </receiver>

参考:【Android系统广播大全】

  1. String ADD_SHORTCUT_ACTION 动作:在系统中添加一个快捷方式。
  2. String ALL_APPS_ACTION 动作:列举所有可用的应用。输入:无。
  3. String ALTERNATIVE_CATEGORY 类别:说明 activity 是用户正在浏览的数据的一个可选操作。
  4. String ANSWER_ACTION 动作:处理拨入的电话。
  5. String BATTERY_CHANGED_ACTION 广播:充电状态,或者电池的电量发生变化。
  6. String BOOT_COMPLETED_ACTION 广播:在系统启动后,这个动作被广播一次(只有一次)。
  7. String BROWSABLE_CATEGORY 类别:能够被浏览器安全使用的 activities 必须支持这个类别。
  8. String BUG_REPORT_ACTION 动作:显示 activity 报告错误。
  9. String CALL_ACTION 动作:拨打电话,被呼叫的联系人在数据中指定。
  10. String CALL_FORWARDING_STATE_CHANGED_ACTION 广播:语音电话的呼叫转移状态已经改变。
  11. String CLEAR_CREDENTIALS_ACTION 动作:清除登陆凭证 (credential)。
  12. String CONFIGURATION_CHANGED_ACTION 广播:设备的配置信息已经改变,参见 Resources.Configuration.
  13. Creator CREATOR 无 无
  14. String DATA_ACTIVITY_STATE_CHANGED_ACTION 广播:电话的数据活动(data activity)状态(即收发数据的状态)已经改变。
  15. String DATA_CONNECTION_STATE_CHANGED_ACTION 广播:电话的数据连接状态已经改变。
  16. String DATE_CHANGED_ACTION 广播:日期被改变。
  17. String DEFAULT_ACTION 动作:和 VIEW_ACTION 相同,是在数据上执行的标准动作。
  18. String DEFAULT_CATEGORY 类别:如果 activity 是对数据执行确省动作(点击, center press)的一个选项,需要设置这个类别。
  19. String DELETE_ACTION 动作:从容器中删除给定的数据。
  20. String DEVELOPMENT_PREFERENCE_CATEGORY 类别:说明 activity 是一个设置面板 (development preference panel).
  21. String DIAL_ACTION 动作:拨打数据中指定的电话号码。
  22. String EDIT_ACTION 动作:为制定的数据显示可编辑界面。
  23. String EMBED_CATEGORY 类别:能够在上级(父)activity 中运行。
  24. String EMERGENCY_DIAL_ACTION 动作:拨打紧急电话号码。
  25. int FORWARD_RESULT_LAUNCH 启动标记:如果这个标记被设置,而且被一个已经存在的 activity 用来启动新的 activity,已有 activity 的回复目标 (reply target) 会被转移给新的 activity。
  26. String FOTA_CANCEL_ACTION 广播:取消所有被挂起的 (pending) 更新下载。
  27. String FOTA_INSTALL_ACTION 广播:更新已经被确认,马上就要开始安装。
  28. String FOTA_READY_ACTION 广播:更新已经被下载,可以开始安装。
  29. String FOTA_RESTART_ACTION 广播:恢复已经停止的更新下载。
  30. String FOTA_UPDATE_ACTION 广播:通过 OTA 下载并安装操作系统更新。
  31. String FRAMEWORK_INSTRUMENTATION_TEST_CATEGORY 类别:To be used as code under test for framework instrumentation tests.
  32. String GADGET_CATEGORY 类别:这个 activity 可以被嵌入宿主 activity (activity that is hosting gadgets)。
  33. String GET_CONTENT_ACTION 动作:让用户选择数据并返回。
  34. String HOME_CATEGORY 类别:主屏幕 (activity),设备启动后显示的第一个 activity。
  35. String INSERT_ACTION 动作:在容器中插入一个空项 (item)。
  36. String INTENT_EXTRA 附加数据:和 PICK_ACTIVITY_ACTION 一起使用时,说明用户选择的用来显示的 activity;和 ADD_SHORTCUT_ACTION 一起使用的时候,描述要添加的快捷方式。
  37. String LABEL_EXTRA 附加数据:大写字母开头的字符标签,和 ADD_SHORTCUT_ACTION 一起使用。
  38. String LAUNCHER_CATEGORY 类别:Activity 应该被显示在顶级的 launcher 中。
  39. String LOGIN_ACTION 动作:获取登录凭证。
  40. String MAIN_ACTION 动作:作为主入口点启动,不需要数据。
  41. String MEDIABUTTON_ACTION 广播:用户按下了“Media Button”。
  42. String MEDIA_BAD_REMOVAL_ACTION 广播:扩展介质(扩展卡)已经从 SD 卡插槽拔出,但是挂载点 (mount point) 还没解除 (unmount)。
  43. String MEDIA_EJECT_ACTION 广播:用户想要移除扩展介质(拔掉扩展卡)。
  44. String MEDIA_MOUNTED_ACTION 广播:扩展介质被插入,而且已经被挂载。
  45. String MEDIA_REMOVED_ACTION 广播:扩展介质被移除。
  46. String MEDIA_SCANNER_FINISHED_ACTION 广播:已经扫描完介质的一个目录。
  47. String MEDIA_SCANNER_STARTED_ACTION 广播:开始扫描介质的一个目录。
  48. String MEDIA_SHARED_ACTION 广播:扩展介质的挂载被解除 (unmount),因为它已经作为 USB 大容量存储被共享。
  49. String MEDIA_UNMOUNTED_ACTION 广播:扩展介质存在,但是还没有被挂载 (mount)。
  50. String MESSAGE_WAITING_STATE_CHANGED_ACTION 广播:电话的消息等待(语音邮件)状态已经改变。
  51. int MULTIPLE_TASK_LAUNCH 启动标记:和 NEW_TASK_LAUNCH 联合使用,禁止将已有的任务改变为前景任务 (foreground)。
  52. String NETWORK_TICKLE_RECEIVED_ACTION 广播:设备收到了新的网络 "tickle" 通知。
  53. int NEW_TASK_LAUNCH 启动标记:设置以后,activity 将成为历史堆栈中的第一个新任务(栈顶)。
  54. int NO_HISTORY_LAUNCH 启动标记:设置以后,新的 activity 不会被保存在历史堆栈中。
  55. String PACKAGE_ADDED_ACTION 广播:设备上新安装了一个应用程序包。
  56. String PACKAGE_REMOVED_ACTION 广播:设备上删除了一个应用程序包。
  57. String PHONE_STATE_CHANGED_ACTION 广播:电话状态已经改变。
  58. String PICK_ACTION 动作:从数据中选择一个项目 (item),将被选中的项目返回。
  59. String PICK_ACTIVITY_ACTION 动作:选择一个 activity,返回被选择的 activity 的类(名)。
  60. String PREFERENCE_CATEGORY 类别:activity是一个设置面板 (preference panel)。
  61. String PROVIDER_CHANGED_ACTION 广播:更新将要(真正)被安装。
  62. String PROVISIONING_CHECK_ACTION 广播:要求 polling of provisioning service 下载最新的设置。
  63. String RUN_ACTION 动作:运行数据(指定的应用),无论它(应用)是什么。
  64. String SAMPLE_CODE_CATEGORY 类别:To be used as an sample code example (not part of the normal user experience).
  65. String SCREEN_OFF_ACTION 广播:屏幕被关闭。
  66. String SCREEN_ON_ACTION 广播:屏幕已经被打开。
  67. String SELECTED_ALTERNATIVE_CATEGORY 类别:对于被用户选中的数据,activity 是它的一个可选操作。
  68. String SENDTO_ACTION 动作:向 data 指定的接收者发送一个消息。
  69. String SERVICE_STATE_CHANGED_ACTION 广播:电话服务的状态已经改变。
  70. String SETTINGS_ACTION 动作:显示系统设置。输入:无。
  71. String SIGNAL_STRENGTH_CHANGED_ACTION 广播:电话的信号强度已经改变。
  72. int SINGLE_TOP_LAUNCH 启动标记:设置以后,如果 activity 已经启动,而且位于历史堆栈的顶端,将不再启动(不重新启动) activity。
  73. String STATISTICS_REPORT_ACTION 广播:要求 receivers 报告自己的统计信息。
  74. String STATISTICS_STATE_CHANGED_ACTION 广播:统计信息服务的状态已经改变。
  75. String SYNC_ACTION 动作:执行数据同步。
  76. String TAB_CATEGORY 类别:这个 activity 应该在 TabActivity 中作为一个 tab 使用。
  77. String TEMPLATE_EXTRA 附加数据:新记录的初始化模板。
  78. String TEST_CATEGORY 类别:作为测试目的使用,不是正常的用户体验的一部分。
  79. String TIMEZONE_CHANGED_ACTION 广播:时区已经改变。
  80. String TIME_CHANGED_ACTION 广播:时间已经改变(重新设置)。
  81. String TIME_TICK_ACTION 广播:当前时间已经变化(正常的时间流逝)。
  82. String UMS_CONNECTED_ACTION 广播:设备进入 USB 大容量存储模式。
  83. String UMS_DISCONNECTED_ACTION 广播:设备从 USB 大容量存储模式退出。
  84. String UNIT_TEST_CATEGORY 类别:应该被用作单元测试(通过 test harness 运行)。
  85. String VIEW_ACTION 动作:向用户显示数据。
  86. String WALLPAPER_CATEGORY 类别:这个 activity 能过为设备设置墙纸。
  87. String WALLPAPER_CHANGED_ACTION 广播:系统的墙纸已经改变。
  88. String WALLPAPER_SETTINGS_ACTION 动作:显示选择墙纸的设置界面。输入:无。
  89. String WEB_SEARCH_ACTION 动作:执行 web 搜索。
  90. String XMPP_CONNECTED_ACTION 广播:XMPP 连接已经被建立。
  91. String XMPP_DISCONNECTED_ACTION 广播:XMPP 连接已经被断开。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,736评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,167评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,442评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,902评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,302评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,573评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,847评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,562评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,260评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,531评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,021评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,367评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,016评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,068评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,827评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,610评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,514评论 2 269

推荐阅读更多精彩内容