文档视界 最新最全的文档下载
当前位置:文档视界 › Android开发中的多线程编程技术

Android开发中的多线程编程技术

Android开发中的多线程编程技术
Android开发中的多线程编程技术

Android开发中的多线程编程技术

多线程这个令人生畏的“洪水猛兽”,很多人谈起多线程都心存畏惧。在Android开发过程中,多线程真的很难吗?多线程程序的“麻烦”源于它很抽象、与单线程程序运行模式不同,但只要掌握了它们的区别,编写多线程程序就会很容易了。下面让我们集中精力开始学习吧!

多线程案例——计时器

我在给我的学生讲多线程的时候都会举一个计时器的案例,因为计时器案例是多线程的经典应用。

这个案例中,屏幕启动之后,进入如图8-1所示的界面。

屏幕上有一个文本框用于显示逝去的时间,此外还有一个“停止计时”按钮。案例的用例图如图8-2所示。

▲图8-1 计时器界面

▲图8-2 计时器用例图

能够在屏幕上“实时地显示”时间的流逝,单线程程序是无法实现的,必须要多线程程序才可以实现,即便有些计算机语言可以通过封装好的类实现这一功能,但从本质上讲这些封装好的类就是封装了一个线程。

综上所述,完成本案例用到的知识及技术如下:

1)进程和线程的概念;

2)Java中的线程,在Java中创建线程的方式;

3)Android中的线程,包括:Message、Handler、Looper和HandlerThread 等概念。

线程究竟是什么?在Windows操作系统出现之前,个人计算机上的操作系统都是单任务系统,只有在大型计算机上才具有多任务和分时设计。Windows、Linux 操作系统的出现,把原本只在大型计算机才具有的优点,带到了个人计算机系统中。

进程概念

一般可以在同一时间内执行多个程序的操作系统都有进程的概念。一个进程就是一个执行中的程序,而每一个进程都有自己独立的一块内存空间、一组系统资源。在进程的概念中,每一个进程的内部数据和状态都是完全独立的。在Windows操作系统下我们可以通过〈Ctrl+Alt+Del〉组合键查看进程,在UNIX 和Linux操作系统下是通过PS命令查看进程的。打开Windows当前运行的进程,如图8-3所示。

▲图8-3 Windows操作系统进程

在Windows操作系统中一个进程就是一个exe或dll程序,它们相互独立,互相也可以通信,在Android操作系统中进程间的通信应用也是很多的。

线程概念

多线程指的是在单个程序中可以同时运行多个不同的线程,执行不同的任务。多线程意味着一个程序的多行语句可以看上去几乎在同一时间内同时运行。

线程与进程相似,是一段完成某个特定功能的代码,是程序中单个顺序的流控制。但与进程不同的是,同类的多个线程共享一块内存空间和一组系统资源,所以系统在各个线程之间切换时,资源占用要比进程小得多,正因如此,线程也被称为轻量级进程。一个进程中可以包含多个线程。图8-4所示是计时器程序进程和线程之间的关系,主线程负责管理子线程,即子线程的启动、挂起、停止等操作。

▲图8-4 进程和线程关系

Java中的线程

Java的线程类是https://www.docsj.com/doc/084419292.html,ng.Thread类。当生成一个Thread类的对象之后,一个新的线程就产生了。Java中每个线程都是通过某个特定Thread对象的方法run()来完成其操作的,方法run( )称为线程体。

下面是构建线程类几种常用的方法:

public Thread()

public Thread(Runnable target)

public Thread(Runnable target, String name)

public Thread(String name)

参数target是一个实现Runnable接口的实例,它的作用是实现线程体的run()方法。目标target可为null,表示由本身实例来执行线程。name参数指定线程名字,但没有指定的构造方法,线程的名字是JVM分配的,例如JVM指定为thread-1、thread-2等名字。

1、Java中的实现线程体方式1

在Java中有两种方法实现线程体:一是继承线程类Thread,二是实现接口Runnable。下面我们先看看继承线程类Thread方式。

如果采用第1种方式,它继承线程类Thread并重写其中的方法 run(),在初始化这个类实例的时候,目标target可为null,表示由本实例来执行线程体。由于Java只支持单重继承,用这种方法定义的类不能再继承其他父类,例如代码清单8-1,完整代码请参考chapter8_1工程中chapter8_1代码部分。

【代码清单8-1】

public class chapter8_1 extends Thread {

boolean isRunning = true;

int timer = 0;

/**

* 线程体代码

*/

@Override

public void run() {

while (isRunning) {

try {

Thread.currentThread().sleep(1000);

timer++;

System.out.println("逝去了 "+timer+" 秒");

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

public static void main(String[] args) {

chapter8_1 t1 = new chapter8_1();

t1.start();

System.out.println("计时器启动...");

BufferedReader br = new BufferedReader(new InputStreamReader(System.i n));

try {

String line = br.readLine();

if (line.equalsIgnoreCase("1")) {

t1.isRunning = false;

/*t1.stop();*/

}

} catch (IOException e) {

e.printStackTrace();

}

}

}

在main主方法中通过new chapter8_1()创建子线程,并通过t1.start()方法启动子线程,main主方法所在线程为主线程,主线程负责管理其他的子线程。本例进程、主线程和子线程之间的关系如图8-5所示。

子线程启动之后就开始调用run()方法,run()是一个线程体,我们在子线程中处理事情就是在这里编写代码实现的。本案例中子线程要做的事情就是:休眠1s,计时器加1,再反复执行。Thread.currentThread().sleep(1000)就是休眠1s。

为了能够停止线程,我们在主线程中增加了一个标识,通过在控制台输入一个字符

“1”来改变该标识t1.isRunning = false,从而结束这个线程。

▲图8-5 线程间关系图

注意:

事实上线程中有一个stop()方法也可以停止线程,但是由于这种方法会产生线程死锁问题,所以在新版JDK中已经废止了,它的替代解决方法就是增加标识,就是我们在本例中采用的方案。

很多人觉得线程难理解,主要有两个问题:

线程休眠,既然线程已经休眠了,程序的运行速度还能提高吗?

线程体一般都进行死循环,既然线程死循环,程序就应该死掉了,就会没有反应。

1.关于线程休眠问题

对线程休眠问题头痛的读者,其实还是在用单线程的思维模式考虑问题,多数情况下我们的PC都是单CPU的,某个时间点只能有一个线程运行。所谓多线程就是多个线程交替执行就好像同时运行似的。因此,休眠当前线程可以交出CPU控制权,让其他的线程有机会运行,多个线程之间只有交替运行效率才是最

高的,这就像我们开车过十字路口,只有我等等,让你先过,你再等等让他先过,才能保证最高效率,否则就会造成交通系统崩溃,对线程情况也是一样的。因此,多线程中线程的休眠是程序运行的最有效方式。

2.关于线程体死循环问题

在单线程中如果是死循环,程序应就会死掉,没有反应,但是多线程中线程体(run方法)中的死循环,可以保证线程一直运行,如果不循环线程,则运行一次就停止了。在上面的例子中线程体运行死循环,可以保证线程一直运行,每次运行都休眠1s,然后唤醒,再然后把时间信息输出到控制台。所以,线程体死循环是保证子线程一直运行的前提。由于是子线程它不会堵塞主线程,就不会感觉到程序死掉了。但是需要注意的是有时我们确实执行一次线程体,就不需要循环了。

程序运行后开始启动线程,线程启动后就计算逝去的时间,每过1s将结果输出到控制台。当输入1字符后线程停止,程序终止。如图8-6所示。

▲图8-6 运行显示图

Java中的实现线程体方式2

上面介绍继承Thread方式实现线程体,下面介绍另一种方式,这种方式是提供一个实现接口Runnable的类作为一个线程的目标对象,构造线程时有两个带有Runnable target参数的构造方法:

Thread(Runnable target);

Thread(Runnable target, String name)。

其中的target就是线程目标对象了,它是一个实现Runnable的类,在构造Thread类时候把目标对象(实现Runnable的类)传递给这个线程实例,由该目标对象(实现Runnable的类)提供线程体run()方法。这时候实现接口Runnable的类仍然可以继承其他父类。

请参看代码清单8-2,这是一个Java AWT的窗体应用程序,完整代码请参考chapter8_2工程中chapter8_2_1代码部分。

【代码清单8-2】

public class chapter8_2_1 extends Frame implements ActionListener, Ru nnable {

private Label label;

private Button button1;

private Thread clockThread;

private boolean isRunning = false;

private int timer = 0;

public chapter8_2_1() {

button1 = new Button("结束计时");

label = new Label("计时器启动...");

button1.addActionListener(this);

setLayout(new BorderLayout());

add(button1, "North");

add(label, "Center");

setSize(320, 480);

setVisible(true);

clockThread = new Thread(this);

/* 线程体是Clock对象本身,线程名字为"Clock" */

clockThread.start(); /* 启动线程 */

isRunning = true;

}

@Override

public void actionPerformed(ActionEvent event) {

isRunning = false;

}

@Override

public void run() {

while (isRunning) {

try {

Thread.currentThread().sleep(1000);

timer++;

label.setText("逝去了 " + timer + " 秒");

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

public static void main(String args[]) {

chapter8_2_1 a = new chapter8_2_1();

}

}

其中关于Java AWT知识本书就不在这里介绍了,有兴趣的读者可以自己看看相关书籍。在本例中构建AWT窗体的应用程序方式是继承Frame类。采用第1种方式——继承方式实现线程体是不可以的,因为Java是单继承的,这个类不能既继承Frame又继承Thread。应该采用第2种方式——实现Runnable接口方式。Runnable接口也有一个run()方法,它是实现线程体方法,其代码处理与上一节是一样。需要注意的是,在第2种方法中,创建了一个Thread成员变量clockThread,才用构造方法new Thread(this)创建一个线程对象,其中创建线程使用的构造方法是Thread(Runnable target),其中的this就是代表本实例,它是一个实现了Runnable接口的实现类。

程序运行结果如图8-7所示,屏幕开始加载的时候线程启动开始计算时间,1s更新一次UI,当单击“结束计时”按钮时,停止计时。

▲图8-7 运行结果图

Java中的实现线程体方式3

实现线程体方式3是实现线程体方式2的变种,本质上还是实现线程体方式2,但是在Android应用开发中经常采用第3种方式。下面我们看第3种方式的计时器代码清单8-3,完整代码请参考chapter8_2工程中 chapter8_2_2代码部分。

【代码清单8-3】

public class chapter8_2_2 extends Frame implements ActionListener {

private Label label;

private Button button1;

private Thread clockThread;

private boolean isRunning = false;

private int timer = 0;

public chapter8_2_2() {

button1 = new Button("结束计时");

label = new Label("计时器启动...");

button1.addActionListener(this);

setLayout(new BorderLayout());

add(button1, "North");

add(label, "Center");

setSize(320, 480);

setVisible(true);

/* 线程体是Clock对象本身,线程名字为"Clock" */

clockThread = new Thread(new Runnable() {

@Override

public void run() {

while (isRunning) {

try {

Thread.currentThread().sleep(1000);

timer++;

label.setText("逝去了 " + timer + " 秒");

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

});

clockThread.start(); /* 启动线程 */

isRunning = true;

}

@Override

public void actionPerformed(ActionEvent event) {

isRunning = false;

}

public static void main(String args[]) {

chapter8_2_2 a = new chapter8_2_2();

}

}

与第2种方式比较,我们发现Frame类不再实现Runnable接口了,而是在实例化Thread类的时候,定义了一个实现Runnable接口的匿名内部类:

clockThread = new Thread(new Runnable() {

@Override

public void run() {

while (isRunning) {

try {

Thread.currentThread().sleep(1000);

timer++;

label.setText("逝去了 " + timer + " 秒");

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

});

有关Java多线程的内容还有很多,例如线程优先级、线程同步等,由于这些内容与本书关系不是很紧密,所以不再介绍了,有关其他的线程知识可以参考Java方面的书籍。接下来介绍一下Android中的线程。

Android中的线程

在Android平台中多线程应用很广泛,在UI更新、游戏开发和耗时处理(网络通信等)等方面都需要多线程。Android线程涉及的技术有:

Handler;Message;MessageQueue;Looper;HandlerThread。

Android线程应用中的问题与分析

为了介绍这些概念,我们把计时器的案例移植到Android系统上,按照在Frame方式修改之后的代码清单8-4,完整代码请参考chapter8_3工程中chapter8_3代码部分。

【代码清单8-4】

public class chapter8_3 extends Activity {

private String TAG = "chapter8_3";

private Button btnEnd;

private TextView labelTimer;

private Thread clockThread;

private boolean isRunning = true;

private int timer = 0;

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(https://www.docsj.com/doc/084419292.html,yout.main);

btnEnd = (Button) findViewById(R.id.btnEnd);

btnEnd.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

isRunning = false;

}

});

labelTimer = (TextView) findViewById(https://www.docsj.com/doc/084419292.html,belTimer);

/* 线程体是Clock对象本身,线程名字为"Clock" */

clockThread = new Thread(new Runnable() {

@Override

public void run() {

while (isRunning) {

try {

Thread.currentThread().sleep(1000);

timer++;

labelTimer.setText("逝去了 " + timer + " 秒");

Log.d(TAG, "lost time " + timer);

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

});

clockThread.start(); /* 启动线程 */

}

}

程序打包运行结果出现了异常,如图8-8所示。

▲图8-8 运行结果异常图我们打开LogCat窗口,出错日志信息如图8-9所示。

▲图8-9 出错日志

系统抛出的异常信息是“Only the original thread that created a view hierarchy can touch its views”,在Android中更新UI处理必须由创建它的线程更新,而不能在其他线程中更新。上面的错误原因就在于此。

现在分析一下上面的案例,在上面的程序中有两个线程:一个主线程和一个子线程,它们的职责如图8-10所示。

由于labelTimer是一个UI控件,它是在主线程中创建的,但是它却在子线程中被更新了,更新操作在clockThread线程的run()方法中实现,代码如下:

▲图8-10 线程职责

/* 线程体是Clock对象本身,线程名字为"Clock" */

clockThread = new Thread(new Runnable() {

@Override

public void run() {

while (isRunning) {

try {

Thread.currentThread().sleep(1000);

timer++;

labelTimer.setText("逝去了 " + timer + " 秒");

Log.d(TAG, "lost time " + timer);

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

});

这样的处理违背了Android多线程编程规则,系统会抛出异常“Only the original thread that created a view hierarchy can touch its views”。

要解决这个问题,就要明确主线程和子线程的职责。主线程的职责是创建、显示和更新UI控件、处理UI事件、启动子线程、停止子线程;子线程的职责是

计算逝去的时间和向主线程发出更新UI消息,而不是直接更新UI。它们的职责如图8-11所示。

▲图8-11 线程职责

主线程的职责是显示UI控件、处理UI事件、启动子线程、停止子线程和更新UI,子线程的职责是计算逝去的时间和向主线程发出更新UI消息。但是新的问题又出现了:子线程和主线程如何发送消息、如何通信呢?

在Android中,线程有两个对象—消息(Message)和消息队列(MessageQueue)可以实现线程间的通信。下面再看看修改之后的代码清单8-5,完整代码请参考chapter8_4工程中chapter8_4代码部分。

【代码清单8-5】

public class chapter8_4 extends Activity {

private String TAG = "chapter8_3";

private Button btnEnd;

private TextView labelTimer;

private Thread clockThread;

private boolean isRunning = true;

private Handler handler;

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(https://www.docsj.com/doc/084419292.html,yout.main);

btnEnd = (Button) findViewById(R.id.btnEnd);

btnEnd.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

isRunning = false;

}

});

handler = new Handler() {

@Override

public void handleMessage(Message msg) {

switch (msg.what) {

case0:

labelTimer.setText("逝去了 " + msg.obj + " 秒");

}

}

};

labelTimer = (TextView) findViewById(https://www.docsj.com/doc/084419292.html,belTimer);

/* 线程体是Clock对象本身,线程名字为"Clock" */ clockThread = new Thread(new Runnable() {

@Override

public void run() {

int timer = 0;

while (isRunning) {

try {

Thread.currentThread().sleep(1000);

timer++;

/* labelTimer.setText("逝去了 " + timer + " 秒"); */ Message msg = new Message();

msg.obj = timer;

msg.what = 0;

handler.sendMessage(msg);

Log.d(TAG, "lost time " + timer);

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

});

clockThread.start(); /* 启动线程 */

}

有的时候为了将Android代码变得更加紧凑,把线程的创建和启动编写在一条语句中,如下面chapter8_5的代码片段。代码清单8-6所示,完整代码请参考chapter8_5工程中 chapter8_5代码部分。

【代码清单8-6】

new Thread() {

@Override

public void run() {

int timer = 0;

while (isRunning) {

ry {

Thread.currentThread().sleep(1000);

timer++;

/ labelTimer.setText("逝去了 " + timer + " 秒");

Message msg = new Message();

msg.obj = timer;

msg.what = 0;

handler.sendMessage(msg);

Log.d(TAG, "lost time " + timer);

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

}.start();

chapter8_5代码看起来有些糊涂吧?chapter8_4和chapter8_5创建线程的区别是:chapter8_4采用Thread(Runnable target)构造方法创建一个线程,需要提供一个Runnable接口对象,需要提供的参数是实现了Runnable接口的匿名内部类对象。chapter8_5采用Thread()构造方法创建一个线程,在这里采用了简便的编程方法,直接新建一个Thread类,同时重写run()方法。

chapter8_5编程方法虽然晦涩难懂,而且违背了Java编程规范,程序结构也比较混乱,但却是Android习惯写法,这主要源于Android对于减少字节码的追求。究竟这两种方式在性能上有多少差别呢?诚实地讲我没有做过测试和求证,在我看来就上面的程序而言它们之间不会有太大差别,由于本书要尽可能遵守Java编程规范和Android的编程习惯,因此本书中两种编程方式都会采用,如果给大家带来不便敬请谅解。

运行模拟器结果如图8-1所示,加载屏幕后马上开始计时,也可以单击“停止计时”按钮来停止计时。

Android4.0的多媒体框架Nuplayer介绍

Android4.x 的RTSP 框架学习 ——NuPlayer 介绍 本文介绍如下内容: 播放框架介绍 RTSP 源介绍 HTTP 流媒体的区别 要研究的点 NuPlayer 框图: NuPlayer NuPlayerDriver ALooper <<接口>> MediaPlayerInterface NuPlayer::Renderer NuPlayer::Decoder ACodec::UninitializedState AHierarchicalStateMachine ACodec ACodec::UninitializedState ACodec::LoadedToIdleState ACodec::IdleToExecutingState ACodec::ExecutingState ACodec::ExecutingToIdleState ACodec::IdleToLoadedState ACodec::FlushingState AHandler 1 * * 11* <<接口>>NuPlayer::Source *1 NuPlayer::HTTPLiveSource NuPlayer::RTSPSource ALooper 1* MyHandler * 1 ARTPConnection ARTSPConnection ALooper 1* mNetLooper for ARTPConnection ARTPSource ARTPAssembler AAVCAssembler AAVCAssembler AMPEG4AudioAssembler AH263Assembler AAMRAssembler AAMRAssembler AMPEG4ElementaryAssembler ARawAudioAssembler AnotherPacketSource <<接口>>MediaSource APacketSource * 1 * 1* 1OMX AHandler

多媒体一体机(带有安卓系统)使用说明

. .. 关于带有安卓系统的多媒体一体机使用说明 带有安卓系统多媒体一体机是智能触摸电视与电脑的结合,与以前的多媒体一体机操作上存在一 些区别,现将操作使用中注意的问题说明如下: 1、智能触摸电视与传统触摸电视有什么区别? 智能触摸电视是带有安卓操作系统的电视,就如同智能手机一样,可以安装安卓版的程序,具有可扩展性。当电脑出现问题不能用时,依然可以单独使用带有安卓系统的电视完成一些简单的应用,如播放视频、播放幻灯片等操作,但注意这些应用与电脑中的程序不一样,类似于安卓系统的手机功能。而传统触摸电视则不具备这些功能。 2、为什么触摸屏有时不灵敏? 我校的多媒体一体机使用的触摸屏采用的是红外感应的原理,电视四周边框处存在扫描感应区,如果屏幕边框脏了,如落上较多的粉笔灰,就会影响触摸感应,所以一定要及时清理电视屏四周边框污物,否则就会影响触摸感应的灵敏度。 3、如何启动多媒体一体机? 情况一:如果一体机电源插头没有插,当一插入插头,一体机连通电源后,会自动启动电视和电脑。 情况二:在接通电源,并且电视和电脑都处于关闭状态下时(也就是电视指示灯在红色时),启动一体机很方便,只需要点击电视下方面板中“电源”按钮,就会打开电视,进入安卓界面,同时电脑也会自动启动,无需单独启动电脑。启动后在安卓界面的左上角较大的窗格中会显示出电脑的界面,只需点击这个窗格,就可以切换到电脑的界面。 4、如何关闭一体机? 步骤一:正常关闭电脑。也就是点击电脑桌面左下角开始菜单中的“关机”。 步骤二:关闭电视。在关闭电脑后电视画面会先变成蓝屏再切换到安卓的界面。这时再点击电视下方面板的“电源”按钮,关闭电视。电视指示灯会变成红色。 步骤三:拔下一体机电源插头。 5、为什么一体机断电后再通电会自动启动(或一插上电插头一体机就会启动)? 由于安卓系统设计的原因,多媒体一体机的电视和电脑在切断电源后,再接通电源时,无论原来一体机是开着或是关着的,都会自动启动。这就导致在停电后,只要电源插头插着的一体机都会自动启动。这也是有些老师放学时明明关闭了一体机,而第二天来时一体机却开着的一个原因。所以注意,当使用完一体机后,特别是放学以后,一定要拔下一体机的电源插头。再次使用时,插上电源插头后,一体机会自动启动,不需要再按“电源”按钮。如若确实接通电源后一体机没有启动,再按照问题3中的方法启动。 6、为什么一体机没有声音,重新启动后才有声音? 这主要是因为一体机在关闭时,只关闭了电视,而电脑没有正常的关闭。电视的安卓系统和电脑系统都要使用到声卡,如果正常切换两个系统时,声卡的控制权会进行切换,声音不会出现问题。当电脑没有关闭,而电视关闭了以后,再打开电视时,电视的安卓系统会抢占声卡控制权,使用电脑系统没有声音。这时只需要重启电脑就会有声音了。所以一定要正确的关闭一体机。 7、为什么有时在安卓系统和电脑系统之间切换后,触摸屏会没有反应? 由于安卓系统和电脑系统使用触摸屏时都要加载触摸屏驱动,切换后驱动会重新加载,需要一定的时间,这时会导致被误认为是触摸屏失灵或死机。只需要等一会驱动加载完成后就可以正常使用了。 8、出现电脑死机时怎么办? 电脑死机后,可以长按电视面板下方“电脑”按钮10秒,电脑会强制关机,然后再按一次“电脑”按钮,再次启动电脑。如果无法以此种方式重启电脑,则需要拔下一体机插头,电视指示灯灭掉后,重新插上,一体机会自动启动。

多线程技术在Android手机开发中的运用

龙源期刊网 https://www.docsj.com/doc/084419292.html, 多线程技术在Android手机开发中的运用 作者:谢光刘志惠 来源:《电子技术与软件工程》2017年第24期 摘要 在Android手机开发过程中,一般情况下程序是通过一个线程进行工作的,因此当一个任务耗费过长时间,就会造成主程序无响应并对程序运行的顺畅程度造成影响的问题。基于此,本文通过对多线程组成进行介绍,在Android中多线程技术模块与具体实现方式两方面对多线程技术在安卓手机开发中的运用进行探讨,以为关注此问题的人们提供参考。 【关键词】多线程技术 Android手机进程线程 安卓系统自2007年由谷歌公司开发后,得到了巨大的发展。截至2017年3月,其市场占有率已经达到86.4%,如三星、索尼爱立信、小米、OPPO等手机生产厂商都在使用安卓系统。该系统开源免费、执行效率高,其多线程技术开发应用的研究,对提高手机硬件的利用效率,给用户带来良好试用体验,提高手机厂商的企业竞争力有重要作用。 1 多线程介绍 1.1 进程和线程介绍 一般来说,在一定时间内实现多个程序任务执行的程序都会用到“进程”这一概念。进程,即:一个拥有自身独立的内存空间、系统资源的执行程序,其特征为实现内部状态和内部数据的相互独立。线程与进程相似,线程也是一段有一定功能代码组成的流控制。线程的特征为:同类的多个线程可以对内存空间与系统资源进行共享。因此在对资源的占用方面,可以相互切换的线程比进程小很多。一个进程中可以包含诸多线程,此外,主线程对子线程有控制作用,可对子线程启动、停止等动作进行管理。而本文要重点介绍的多线程,指的是单个程序中一起运行的不同线程,不同线程可以执行不一样的任务。其特征是一个程序的多行语句可在某时间同时执行。 1.2 多线程程序消息处理原理 当人们启动一个程序时,系统将建立main线程,主要管理如:activity等应用组件,并对UI相关的事件进行处理,比如用户想要按键或使用屏幕进行绘图,线程会对以上事件进行处理,这是UI线程。安卓的线程模型,所有组件均在main线程中,因此用户在程序中下达下载文件、使用数据库等具有高耗时特征的操作时,就会造成UI线程的运行不畅,并出现程序无法响应的问题。这就要求程序员使用多线程技术,在进行安卓多线程编写时,技术人员应注意以下两点:

Android下使用Http协议实现多线程断点续传下载

0.使用多线程下载会提升文件下载的速度,那么多线程下载文件的过程是: (1)首先获得下载文件的长度,然后设置本地文件的长度 HttpURLConnection.getContentLength(); RandomAccessFile file = new RandomAccessFile("QQWubiSetup.exe","rwd"); file.setLength(filesize);//设置本地文件的长度 (2)根据文件长度和线程数计算每条线程下载的数据长度和下载位置。 如:文件的长度为6M,线程数为3,那么,每条线程下载的数据长度为2M,每条线程开始下载的位置如下图所示。 例如10M大小,使用3个线程来下载, 线程下载的数据长度 (10%3 == 0 ? 10/3:10/3+1) ,第1,2个线程下载长度是4M,第三个线程下载长度为2M 下载开始位置:线程id*每条线程下载的数据长度 = ? 下载结束位置:(线程id+1)*每条线程下载的数据长度-1=? (3)使用Http的Range头字段指定每条线程从文件的什么位置开始下载,下载到什么位置为止, 如:指定从文件的2M位置开始下载,下载到位置(4M-1byte)为止 代码如下:HttpURLConnection.setRequestProperty("Range", "bytes=2097152-4194303"); (4)保存文件,使用RandomAccessFile类指定每条线程从本地文件的什么位置开始写入数据。 RandomAccessFile threadfile = new RandomAccessFile("QQWubiSetup.exe ","rwd"); threadfile.seek(2097152);//从文件的什么位置开始写入数据

安卓多媒体信息发布系统说明书

多媒体信息发布系统 版本号:Ver. 4.0 操作使用说明 中文版

目录 第1章功能特性 (4) 1.1 产品简介 (4) 1.2 产品组成 (4) 1.3 产品功能 (4) 第2章系统环境 (5) 2.1 硬件环境 (5) 2.2 软件环境 (5) 第3章软件安装 (5) 3.1 服务器端 (5) 3.2 播放终端 (9) 3.3 终端设置 (9) 第4章功能说明 (10) 4.1 系统登录 (10) 4.2 快速制作节目 (11) 4.3 节目管理 (13) 4.3.1 节目制作 (13) 4.3.1.1 添加图片 (14) 4.3.1.2 添加视频 (16) 4.3.1.3 添加 Flash (17) 4.3.1.4 添加网页 (17) 4.3.1.5 添加时间 (18) 4.3.1.6 添加天气 (18) 4.3.1.7 添加 RSS (19) 4.3.1.8 添加截屏 (20) 4.3.1.9 添加 PPT (21) 4.3.1.10 添加 Word (21) 4.3.1.11 添加 Excel (22) 4.3.1.12 添加文本 (22) 4.3.1.13 文本编辑工具 (23) 4.3.1.14 其它功能按钮 (23) 4.3.2 节目列表 (23)

4.3.3 节目审核 (24) 4.4 发布管理 (24) 4.4.1 立即发布 (24) 4.4.2 插播任务 (25) 4.4.3 循环任务 (25) 4.4.4 下载状态 (26) 4.4.5 发布通知 (26) 4.5 终端操作 (26) 4.5.1 终端监控 (27) 4.5.2 开关设置 (27) 4.5.3 清除文件 (27) 4.5.4 更名分组 (28) 4.5.5 参数设置 (28) 4.6 系统操作 (28) 4.6.1 终端认证 (28) 4.6.2 用户管理 (29) 4.6.3 操作日志 (29) 4.6.4 负载设置 (30) 4.7 其它功能 (30) 4.7.1 首页 (30) 4.7.2 修改密码 (30) 4.7.3 退出 (30) 4.7.4 后退 (30)

AndroidUI之线程与进度对话框

//创建一个进度条对话框 final ProgressDialog progressdialog=new ProgressDialog(MainActivity.this); progressdialog.setTitle("测试"); progressdialog.setMessage("正在对话框与线程"); progressdialog.show();//显示对话框 //创建线程 new Thread(){ public void run(){ try{ sleep(1000);//时间间隔1秒 }catch(Exception e){ e.printStackTrace(); }finally{ progressdialog.dismiss();//卸载对话框对象 } } }.start(); 菜单的创建于事件监听 public boolean onCreateOptionsMenu(Menu menu) { int a=Menu.NONE;//声明菜单顺序ID int b=Menu.NONE+1; int c=Menu.NONE+2; int d=Menu.NONE+3; menu.add(0, 1, a, "a");//第一个参数:分组,第二个参数:菜单的Id, 第三个参数:菜单的顺序,第四个参数:显示菜单的文字 menu.add(1, 2, b, "b"); menu.add(2, 3, b, "c"); menu.add(2, 4, d, "d"); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case 1: Toast.makeText(MainActivity.this,"a", 1).show(); break; case 2: Toast.makeText(MainActivity.this,"b", 1).show(); break;

android课程介绍

1.课程基本信息 课程编号:M21F58D10 课程名称:Android应用与开发 开设学期:第3学期 总学时:60 总学分:4 课程类别:岗位能力课程课程性质:必修课 适用专业:软件技术(移动应用开发) 责任单位:计算机与软件学院 2.课程定位 《Android应用与开发》课程是软件技术(移动应用开发方向)专业的岗位能力课程,课程的开设依据是软件技术专业人才培养目标和相关职业岗位(群)的能力要求,对本专业所面向的手机软件开发与测试、软件开发与项目管理等岗位所需要的知识、技能和素质目标的达成起支撑作用。 在课程设置上,前导课程有《Java程序设计》(M21F1611),《数据结构》(M21F232),后续课程有《移动互联网开发综合实训》(M21J57B10)、《毕业实习》(M21J991)。 3.课程设计思路 首先依据专业人才培养方案中关于人才培养目标的阐述,明确课程目标;其次,结合职业教育课程观、教学观、能力观,基于软件工程的开发过程,以项目化教学来组织课程内容,在课程内容的选择与排序中,以软件项目研发的不同阶段、典型任务为载体,将课程内容划分为互相联系的学习情景;第三,通过对各学习情景中学习目标、主要内容、授课方式、师生要求等各项内容的描述,来规范课程所要求的内容;第四,通过对课程内容的选取和组合,以一个完整的项目为载体,完成课程的实施;最后,通过对项目实施过程中各个环节的考察和评价,来完成对课程的评鉴与考核。 本课程在设计上本着懂方法,重应用的总体思路,突出体现职业教育的技能型、应用性特色,着重培养学生的实践应用技能,力求达到理论方法够用,技术技能过硬的目的。 4.课程建设基本理念 本课程按照理论实践一体、课内外互补、课堂教学与培优工程相结合的课程设计指导思想,以任务或项目为载体组织教学内容,突出学生的主体地位,实现“教、学、做”的有机融合;通过班级讲授、团队学习、个体辅导、展示交流、技能大赛等手段,实现从模仿到应用到创新的高职学生递进式培养。 本课程强调对学生职业岗位能力的培养和职业素养的养成,针对不同环节,采用特定的教学方法,有意识、有步骤地将职业能力的训练和职业素养的形成融入到实际的教学过程中。

Android应用程序开发完整训练:从零起步通过23个动手实战案例精通App开发

从零起步,24小时内通过23个动手实战案例,循序渐进的对Android商业级别的应用程序开发要点各个击破,依托于在多年的Android(6款完整的硬件产品和超过20款应用软件)开发和企业级培训经验(超过150期的次Android的企业内训和公开课),旨在在实务的基础之上帮助你完成任何复杂程序的高质量Android应用程序开发,让Android开发跟上想象的速度。最后,通过ActivityManagerService揭秘Android应用程序一切行为背后的核心根源,让你从此开发应用程序居高零下、举重若轻。 课程要点: 1,抽取Android应用开发中用到的最精华的Java技术加以剖析; 2,从零起步构建Android开发环境和编写并彻底剖析第一个Android程序; 3,彻底剖析不同Activity之间所有的交互模式; 4,根据商业化场景彻底剖析Android的生命周期及其使用的最佳时间; 5,使用JUnit测试Android业务代码; 6,掌握Android基本和核心的UI开发技术; 7,”Android商业化高级UI实战”是根据过去20多款商业级别Android应用程序开发尤其是类似CRM系统中最经典、最经常使用的技术抽取而成,掌握之后基本上不会在遇到UI 方面的难点; 8,细致剖析并实战Android性能测试,找出性能瓶颈,并进行代码优化,分享代码优化的最佳实践; 9,对数据的处理时Android绝大多数应用程序的核心,尤其是对CRM系统而言,这一天,我们会对Android中的本地数据处理方式及其商业使用场景进行彻底剖析和实战; 10,从SharedPreferences到内部文件系统,从SDCard操作到SQLite数据库,从XML 和JSON的解析于生成到数据共享统一接口ContentProvider,对Android本地的数据处理方式进行地毯式轰炸; 11,通讯录的操作的原理、流程和场景等进行了情景再现性的代码实战; 12,通过Android手机卫士商业级别的代码案例实战Android中BroadcastReceiver和Service; 13,根据过去20多款程序的商业实战总结出了能够解决基于HTTP协议的任意文件类型、任意大小文件的网络上传和下载,Android网络开发从此一劳永逸; 14,实战WiFi数据交换; 15,尤其是额外提到异步http框架,具备很强的商业价值; 16,Android横竖屏切换的经典场景、生命周期和解决方案; 17,实战构建多语言国际化的Android应用程序; 18,如何编译APK来提高应用的安全性; 19,如何反编译Android应用 20,通过Android中WebView的特性洞悉Android中JavaScript与Java相互沟通的密码,追寻浏览器和HTML5开发的架构和技术实现根源; 21,使用NDK等技术利用C/C++的高效性来提高应用程序的性能; 22,实现Android中以Looper、Handler、Message、MessageQueue为核心的线程间通信方式; 23,实战并剖析AsyncTask框架实现的源代码,并提出对AsyncTask缺陷的解决方案;

Android多媒体分析

MediaPlayer播放器调用及Parser实现过程 一、调用播放器 (Frameworks) 在mediaPlayer中,根据前面打开的文件格式,分别调用三种播放器的一种。分别为PVPlayer、MidiPlayer、VobisPlayer,下面说明具体步聚:1... 获取文件格式 在MediaScanner.java JAVA程序中,可以得到以下几个文件信息: (1)文件格式,比如MP3,MP4等。 (2)文件类别:音频,视频。 (3)文件来源:本地,网络。 得到文件相关信息后,如果系统支持,则加入到播放列表,反之则DELETE 加载的相关资源。获取具体信息的相关函数调用了MediaFile.java程序相关函数实现。 FILE:MediaScanner.java ../Frameworks/base/media/java/media MediaFile.java ../Frameworks/base/media/java/media 2.创建播放器(MediaPlayer Service) 在系统中,一共有三种播放器: (1) PVPlayer:一般的本地文件播放都用PVPLAYER (2) MidiPlayer:这个播放器目前还没有测试。 (3) VobisPlayer:通过URL网络播放。 在这一层中,主要在MediaPlayerService.cpp文件中实现,根据得到的播放格式(getPlayerType函数)创建相关的播放器(createPlayer)。如果创建了PVPlayer,则直接进入了OpenCore,如果为另外两种播放器,需要对文件的一处理程序在同路径下分别有一个文件(Midifile.cpp和vorbisPlayer.cpp). FILE:MediaPlayerService.cpp ../Frameworks/base/media/Libmedia

Android平台介绍及使用指导

Android平台介绍及使用指导 二○一○年二月 版本 1.0

目录 Android平台介绍 ................................................................................... - 4 -基本名词...................................................................................................................... - 5 - 操作方法介绍 .......................................................................................... - 6 - 手机按键介绍.............................................................................................................. - 6 - 快捷键介绍.................................................................................................................. - 6 - 信息功能介绍.............................................................................................................. - 7 - 联系人功能介绍........................................................................................................ - 11 - 通话记录功能介绍.................................................................................................... - 14 - 文本粘贴/复制功能介绍.......................................................................................... - 14 - Push Email(Moxier)功能介绍............................................................................ - 15 - 电子邮件功能介绍.................................................................................................... - 16 - 桌面功能介绍............................................................................................................ - 19 - 蓝牙功能介绍............................................................................................................ - 23 - Wifi功能介绍........................................................................................................... - 23 - 飞行模式功能介绍.................................................................................................... - 23 - CDMA数据链接介绍................................................................................................... - 24 - 黑屏解锁功能............................................................................................................ - 25 - 回复出厂设置............................................................................................................ - 26 - 应用程序设置............................................................................................................ - 26 - GPS设置..................................................................................................................... - 27 - 手机中英文语言切换................................................................................................ - 28 - 更换手机输入法........................................................................................................ - 29 - 数据线链接Android手机........................................................................................ - 29 - 手机测试模式进入方法............................................................................................ - 30 - 横屏显示介绍............................................................................................................ - 30 - 浏览器功能介绍........................................................................................................ - 31 - RSS功能介绍............................................................................................................ - 32 - Q/A- 34 -

基于Android的多媒体播放器课程设计报告

【最新资料,WORD文档,可编辑修改】/* 1、开发环境 Android 是一种基于Linux V2.6 内核的综合操作环境。最初,Android 的部署目标是移动电话领域,包括智能电话和更廉价的翻盖手机。Android 全面的计算服务和丰富的功能支持完全有能力扩展到移动电话市场以外。Android 也可以用于其他的平台和应用程序。下面搭建Android的开发环境。 1.1 JDK安装 1、首先把所有要安装文件放在Android_software文件夹中; 2、安装jdk-6u10-rc2-bin-b32-windows-i586-p-12_sep_2008文件; 3、配置环境变量: (1)新建一个用户变量,变量名是JAVA_HOME,变量值为:JDK的安装路径; (2)查看系统变量Path,如果有显示路径加\bin,没有则加%JAVA_HOME%\bin; (3)查看class,如果有显示路径加\lib,没有则加%JAVA_HOME%\lib; 4、解压eclipse-jee-juno-win32文件,运行eclipse.exe,在workspace launcher 窗口中,设置项目保存路径; 1.2 Android SDK安装以及系统设置 在eclipse菜单栏的window子菜单下点击perferences,选择android,在右边的对话框中选择按钮Browse,找到SDK源文件,自动出来SDK包含的Android版本,点击Apply按钮,完成安装; 在用户变量里面,新建一个JA V A_SDK变量,值设置的值为SDK安装的路径; 在系统变量里面加入%JA V A_HOME%\bin,%JA V A_SDK%\tools,%JA V A_SDK%\platform-tools。 图1.设置环境变量 1.3 Eclipse安装以及ADT工具的安装 ADT插件的安装: (1)解压ADT文件; (2)打开eclipse菜单上help 子目录下的Install new software; (3)在弹出的Install窗口中点击Add,在弹出的窗口中,name:ADT Location:点击location按钮找到解压的ADT源文件; (4)安装成功后,重新启动eclipse; 1.4 模拟器的配置 1、运行eclipse,在window子菜单下点击AVD Manager开始配置模拟器; 2、在Android Virtual Device Manager 下点击NEW,开始创建模拟器; 3、在create new Android Virtual Manager窗口中,输入模拟器的名称、版本、 存储卡大小,手机屏幕的分辨率,输入完后,点击Create AVD,创建完成; 4、在Android Virtual Device Manager窗口中,选中模拟器后,点击start, 启动模拟器。 图2 启动模拟器 2、功能说明 2.1 软件结构与布局 设计布局框架分为三个部分:

Android UI线程分析

理解UI线程——swt, Android, 和Swing的UI机理 线程 在做GUI的时候, 无论是SWT, AWT, Swing 还是Android, 都需要面对UI线程的问题, UI线程往往会被单独的提出来单独对待, 试着问自己, 当GUI启动的时候, 后台会运行几个线程? 比如 1. SWT 从Main函数启动 2. Swing 从Main函数启动 3. Android 界面启动 常常我们被告知, 主线程, UI线程, 因此这里很多会回答, 有两个线程, 一个线程是Main, 另外一个是UI. 如果答案是这样, 这篇文章就是写给你的。 OK, 我们以SWT为例, 设计以下方案寻找答案, 第一步, 我们看能否找到两个线程: 1. 从Main中启动SWT的界面, 在启动界面前, 将Main所在的线程打印出来这里设计为Shell中嵌入一个Button 2. 点击Button, 运行一个耗时很长的操作, 反复修改Button的文字, 在该线程中打印该线程的名称 代码是这样的: 1.public static void main(String[] args) { 2.final Display display = Display.getDefault(); 3.final Shell shell = new Shell();

4. shell.setSize(500, 375); 5. shell.setText("SWT Application"); 6. shell.setLayout(new FillLayout()); 7. btn = new Button(shell, SWT.NULL); 8. btn.setText("shit"); 9. registerAction(); 10. shell.open(); 11. https://www.docsj.com/doc/084419292.html,yout(); 12.while (!shell.isDisposed()) { 13.if (!display.readAndDispatch()) 14. display.sleep(); 15. } 16. shell.dispose(); 17. display.dispose(); 18.} 19.private static void registerAction() { 20. btn.addMouseListener(new MouseListener() { 21. @Override 22.public void mouseDoubleClick(MouseEvent e) { 23. // TODO Auto-generated method stub 24. } 25. @Override 26.public void mouseDown(MouseEvent e) { 27. methodA(); 28. } 29. @Override 30.public void mouseUp(MouseEvent e) { 31. } 32. }); 33.} 34./**

1.android发展历程简介

android(Google公司开发的操作系统) Android是一种基于Linux的自由及开放源代码的操作系统,主要使用于移动设备,如智能手机和平板电脑,由Google公司和开放手机联盟领导及开发。尚未有统一中文名称,中国大陆地区较多人使用“安卓”或“安致”。Android操作系统最初由Andy Rubin开发,主要支持手机。2005年8月由Google收购注资。2007年11月,Google与84家硬件制造商、软件开发商及电信营运商组建开放手机联盟共同研发改良Android系统。随后Google以Apache 开源许可证的授权方式,发布了Android的源代码。第一部Android智能手机发布于2008年10月。Android逐渐扩展到平板电脑及其他领域上,如电视、数码相机、游戏机等。2011年第一季度,Android在全球的市场份额首次超过塞班系统,跃居全球第一。2013年的第四季度,Android平台手机的全球市场份额已经达到78.1%。[1] 2013年09月24日谷歌开发的操作系统Android在迎来了5岁生日,全世界采用这款系统的设备数量已经达到10亿台。2014第一季度Android平台已占所有移动广告流量来源的42.8%,首度超越iOS。但运营收入不及iOS。 编程语言 C/C++(底层)Java等(应用层) 系统家族 类Unix,Linux 源码模式 自由及开放源代码软件 内核类型 宏内核(Linux内核) 软件许可 Apache License、GPL等 1系统简介编辑 Android一词的本义指“机器人”,同时也是Google于2007年11月5日 Android logo相关图片(36张) 宣布的基于Linux平台的开源手机操作系统的名称,该平台由操作系统、中间件、用户界面和应用软件组成。 Android一词最早出现于法国作家利尔亚当(Auguste Villiers de l'Isle-Adam)在1886年发表的科幻小说《未来夏娃》(L'ève future)中。他将外表像人的机器起名为Android。Android的Logo是由Ascender公司设计的,诞生于2010年,其设计灵感源于男女厕所门上

Android平台OpenMax多媒体引擎介绍

OpenMax是一个多媒体应用程序的框架标准。其中,OpenMax IL(集成层)技术规格定义了媒体组件接口,以便在嵌入式器件的流媒体框架中快速集成加速编解码器。 在Android中,OpenMax IL层,通常可以用于多媒体引擎的插件,Android的多媒体引擎OpenCore 和StageFright都可以使用OpenMax作为插件,主要用于编解码(Codec)处理。 在Android的框架层,也定义了由Android封装的OpenMax接口,和标准的接口概念基本相同,但是使用C++类型的接口,并且使用了Android的Binder IPC机制。Android封装OpenMax的接口被StageFright使用,OpenCore没有使用这个接口,而是使用其他形式对OpenMax IL层接口进行封装。 Android OpenMax的基本层次结构如图18-1所示。 ▲图18-1 Android中OpenMax的基本层次结构 OpenMax系统的结构 1.OpenMax总体层次结构 OpenMax是一个多媒体应用程序的框架标准,由NVIDIA公司和Khronos在2006年推出。 OpenMax是无授权费的,跨平台的应用程序接口API,通过使媒体加速组件能够在开发、集成和编程环节中实现跨多操作系统和处理器硬件平台,提供全面的流媒体编解码器和应用程序便携化。 OpenMax的官方网站如下所示: https://www.docsj.com/doc/084419292.html,/openmax/ OpenMax实际上分成三个层次,自上而下分别是,OpenMax DL(开发层),OpenMax IL(集成层)和OpenMax AL(应用层)。三个层次的内容分别如下所示。 第一层:OpenMax DL(Development Layer,开发层) OpenMax DL定义了一个API,它是音频、视频和图像功能的集合。硅供应商能够在一个新的处理器上实现并优化,然后编解码供应商使用它来编写更广泛的编解码器功能。它包括音频信号的处理功能,如FFT和filter,图像原始处理,如颜色空间转换、视频原始处理,以实现例如MPEG-4、H.264、MP3、AAC和JPEG等编解码器的优化。 第二层:OpenMax IL(Integration Layer,集成层) OpenMax IL作为音频、视频和图像编解码器能与多媒体编解码器交互,并以统一的行为支持组件(例如,资源和皮肤)。这些编解码器或许是软硬件的混合体,对用户是透明的底层接口应用于嵌入式、移动设备。它提供了应用程序和媒体框架,透明的。S编解码器供应商必须写私有的或者封闭的接口,集成进移动设备。IL的主要目的是使用特征集合为编解码器提供一个系统抽象,为解决多个不同媒体系统之间轻便性的问题。 第三层:OpenMax AL(Appliction Layer,应用层)

Android的线程使用来更新UI----Thread、Handler、Looper、TimerTask等

方法一:(java习惯,在android不推荐使用) 刚刚开始接触android线程编程的时候,习惯好像java一样,试图用下面的代码解决问题new Thread( new Runnable() { public void run() { myView.invalidate(); } }).start(); 可以实现功能,刷新UI界面。但是这样是不行的,因为它违背了单线程模型:Android UI操作并不是线程安全的并且这些操作必须在UI线程中执行。 方法二:(Thread+Handler) 查阅了文档和apidemo后,发觉常用的方法是利用Handler来实现UI线程的更新的。Handler来根据接收的消息,处理UI更新。Thread线程发出Handler消息,通知更新UI。Handler myHandler = new Handler() { public void handleMessage(Message msg) { switch (msg.what) { case TestHandler.GUIUPDATEIDENTIFIER: myBounceView.invalidate(); break; } super.handleMessage(msg); } }; class myThread implements Runnable { public void run() { while (!Thread.currentThread().isInterrupted()) { Message message = new Message(); message.what = TestHandler.GUIUPDATEIDENTIFIER; TestHandler.this.myHandler.sendMessage(message); try { Thread.sleep(100); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } } } } 以上方法demo看:https://www.docsj.com/doc/084419292.html,/blog/411860 方法三:(java习惯,不推荐) 在Android平台中需要反复按周期执行方法可以使用Java上自带的TimerTask类, Tim erTask相对于Thread来说对于资源消耗的更低,除了使用Android自带的

Android SDK介绍

Android SDK介绍 1.Android SDK简介 即Android Software Development Kit.它提供了在Windows/Linux/Mac平台上开发Android应用的开发组件,包含了在Android平台上开发移动应用程序的各种工具集。 2.Android SDK tools 1.Android模拟器(Android Emulator(emulator.exe)) 运行在计算机上的虚拟移动模拟器,可以使用模拟器来在一个实际的Android运行环境下设计,调试和测试应用程序。 2.集成开发环境插件(Android Development Tools Plugin for the Eclipse IDE 即 ADT) 可以直接从Eclipse访问其他Android开发工具.通过它可以进行包括截屏,管理端口转发(port-forwarding),设置断点,观察线程和进程信息. (a)它提供了一个新的项目向导(New Project Wizard),用于快速生成和建立起新 Android应用程序所需的最基本的文件.

(b) 它使得构建Android应用程序的过程变得自动化以及简单化. (c) 它提供了一个android代码编辑器,用于为Android 的manifest和资源文件编写 有效的XML. 3..调试监视服务(Dalvik Debug Monitor Service(ddms.bat) 4.它集成在Dalvik(Android平台虚拟机)中,用于管理运行在模拟器或设备上的进程,并协 助进行调试.可以用它来去除进程,选择一个特定程序来调试,生成跟踪数据,查看堆和线程数据,对模拟器或设备进行屏幕快照等. 5..Android调试桥(Android Debug Bridge(adb.exe)) 6.它用于向模拟器或手机设备安装应用程序的apk文件和从命令行访问模拟器或手机设 备.也可以用于将标准的调试器连接到运行在android模拟器或手机设备上的应用代码. 7..Android资源打包工具(Andoird Asset Packing Tool(aapt.exe)) 8.可以通过aapt工具来创建apk文件,这些文件包含了android应用程序的二进制文件和 资源文件. 9..Android接口描述语言(Android Interface Description Language(aidl.exe)) 10.它用来生成进程间接口代码,在服务中便可用到. 11..SQLite3数据库(sqlit3(sqlite3.exe)) 12.Android应用程序可以创建和使用SQLite数据文件,开发者和使用者也可以方便的访问 这些数据文件. 13..跟踪显示工具(Traceview(traceview.exe)) 14.它可以生成跟踪日志数据的图形分析视图,这些跟踪日志数据由android因公程序产生. 15..创建SD卡工具(mksdcard(mksdcard.exe)) 16.它帮助创建磁盘镜像,这个磁盘镜像可以在模拟器上模拟外部存储卡. 17..DX工具(dx(dx.exe)) 18.它将class字节码重写为android字节码(存储到dex文件中). 19..生成Ant构建文件(activityCreator(activitycreator.bat)) 20.它是一个脚本.用来生成Ant构建文件,Ant构建文件用来编译android应用程序.若是在 安装了ADT插件的Eclipse环境下开发则不需要这个脚本. 21..Android虚拟设备(Android Virtual Devices AVD) 22.每个android虚拟设备(AVD)模拟了单一的虚拟设备来运行android平台,这个平台至 少要包括自己的内核,系统图像和数据分区.开发者可以创建并保存多种虚拟模拟器配置,每种配置环境有其自己的平台版本,硬件配置以及SD卡和用户数据,还可以有不同的显示外观等个性化设置,运行时只需要制定需要使用哪个.即可实现多平台下的模拟测试.

相关文档
相关文档 最新文档