Microsoft Word - 第3章 Activity.doc

Size: px
Start display at page:

Download "Microsoft Word - 第3章 Activity.doc"

Transcription

1 第 3 章 Activity 学习目标 u 掌握 Activity 的生命周期 u 掌握 Activity 的四种启动模式 u 掌握显式意图和隐式意图的使用 u 学会使用 Intent 传递数据在现实生活中, 经常会使用手机进行打电话 发短信 玩游戏等, 这就需要与手机界面进行交互 在 Android 系统中, 用户与程序的交互是通过 Activity 完成的 同时 Activity 也是 Android 四大组件中最常用的一个, 本章将针对 Activity 的相关知识进行详细地讲解 3.1 Activity 入门 Activity 简介 Activity 是 Android 应用程序的四大组件之一, 它负责管理 Android 应用程序的用户界面 一个应用程序一般会包含若干个 Activity, 每一个 Activity 组件负责一个用户界面的展现 同时,Activity 是通过调用 setcontentview() 方法来显示指定组件的 需要注意的是,setContentView() 方法既可以接收 View 对象为参数, 也可以接收布局文件对应的资源 id 为参数 在应用程序中,Activity 就像一个界面管理员, 用户在界面上的操作是通过 Activity 来管理的, 下面列举几个 Activity 的常用事件, 具体如下 : l onkeydown(int keycode,keyevent event): 对应按键按下事件 l onkeyup(int keycode,keyevent event): 对应按键松开事件 l ontouchevent(motionevent event): 对应点击屏幕事件当用户在手机界面上点击按键时, 就会触发 Activity 中对应的事件 onkeydown() 来响应用户的操作 接下来通过应用程序 ActivityBasic 演示上述三个事件的使用 首先, 需要在 MainActivity 中重写相应的方法, 具体代码如下所示 : 1 public class MainActivity extends Activity { 2 protected void oncreate(bundle savedinstancestate) { 3 super.oncreate(savedinstancestate); 4 setcontentview(r.layout.activity_main); 5 } 6 // 响应按键按下事件 7 public boolean onkeydown(int keycode, KeyEvent event) { 8 Toast.makeText(this, " 按键按下!", 0).show();

2 9 return super.onkeydown(keycode, event); 10 } 11 // 响应按键松开事件 12 public boolean onkeyup(int keycode, KeyEvent event) { 13 Toast.makeText(this, " 按键弹起!", 0).show(); 14 return super.onkeyup(keycode, event); 15 } 16 // 响应屏幕触摸事件 17 public boolean ontouchevent(motionevent event) { 18 float x=event.getx(); // 获取触摸点的 X 坐标 19 float y=event.gety(); // 获取触摸点的 Y 坐标 20 Toast.makeText(this, " 点击的坐标为 ("+x+":"+y+")", 0).show(); 21 return super.ontouchevent(event); 22 } 23 } 运行 ActivityBasic 程序, 并做相应的操作, 能看到屏幕中显示的效果如图 3-1 所示 图 3-1 Activity 常用事件 在图 3-1 中, 展示了按键按下事件和点击屏幕的事件 当按键松开时, 也会自动执行 onkeyup 事件, 弹出 Toast 显示 按键弹起 此处省略截图, 初学者可以自己进行测试 Activity 的创建 在 Android 应用中, 可以创建一个或多个 Activity, 创建 Activity 步骤如下所示 : 1) 定义一个类继承自 android.app.activity 或者其子类 ; 2) 在 res/layout 目录中创建一个 xml 文件, 用于创建 Activity 的布局 ; 3) 在 AndroidManifest.xml 文件中注册 Activity; 4) 重写 Activity 的 oncreate() 方法, 并在该方法中使用 setcontentview() 加载指定的布局文件 ; 为了初学者掌握 Activity 的创建, 接下来在 ActivityBasic 程序中添加一个 Activity 名为 ActivityExample, 右键包名选择 New à Class 此时会弹出 New Java Class 窗口, 然后在该

3 窗中的 Name 中输入名称, 并设置 Superclass 为 android.app.activity, 如图 3-2 所示 图 3-2 创建 Activity 点击图 3-2 中的 finish 按钮, 此时 Activity 便创建成功了 接下来在 res/layout 目录下创建 Activity 的布局文件 activity_example.xml, 具体代码如下所示 : <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android=" android:layout_width="match_parent" android:layout_height="match_parent" > <TextView android:layout_width="wrap_content" android:layout_centerhorizontal="true" android:layout_centervertical="true" android:textsize="25dp" android:textcolor="#005522" android:text=" 我是新创建的 Activity" /> </RelativeLayout> 在上述布局文件中, 采用了相对布局的方式, 在布局文件中添加了一个 TextView 控件用于展示信息 接下来在 AndroidManifest.xml 文件中, 对 ActivityExample 进行注册, 具体代码如下所示 : <activity android:name="cn.itcast.activitybasic.activityexample" android:label="activityexample" > <intent-filter> <action android:name="android.intent.action.main" /> <category android:name="android.intent.category.launcher" /> </intent-filter>

4 </activity> 要把 ActivityExample 设置为应用程序默认启动的界面, 需要在 <acitvity> 节点中配置 <intent-filter> 节点 该节点中的 <action android:name="android.intent.action.main" /> 表示将当前 Activity 设置为程序最先启动的 Activity <category ndroid:name="android.intent.category.launcher" /> 表示让当前 Activity 在桌面上创建图标 最后, 在 ActivityExample 中, 重写 oncreate() 方法, 并设置要加载的布局文件, 具体代码如下所示 : public class ActivityExample extends Activity { protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_example); } } 运行程序, 能看到如图 3-3 所示的结果 图 3-3 ActivityExample 界面 从图 3-3 可以看出, 应用一启动就显示 ActivityExample 界面, 说明 ActivityExample 在清单文件 中配置生效并创建成功 Activity 生命周期 生命周期就是一个对象从创建到销毁的过程, 每一个对象都有自己的生命周期 同样,Activity 也具有相应的生命周期,Activity 的生命周期中分为三种状态, 分别是运行状态 暂停状态和停止状态 接下来将针对 Activity 生命周期的三种状态进行详细地讲解 1 运行状态当 Activity 在屏幕的最前端时, 它是可见的 有焦点的 可以用来处理用户的常见操作, 如点击 双击 长按事件等, 这种状态称为运行状态 2 暂停状态在某些情况下,Activity 对用户来说仍然是可见的, 但它不再拥有焦点, 即用户对它的操作是没

5 有实际意义的 例如, 当最上面的 Activity 没有完全覆盖屏幕或者是透明的, 被覆盖的 Activity 仍然对用户可见, 并且存活 ( 它保留着所有的状态和成员信息并保持与 Activity 管理器的连接 ) 但当内存不足时, 这个暂停状态的 Activity 可能会被杀死 3 停止状态当 Activity 完全不可见时, 它就处于停止状态, 但仍然保留着当前状态和成员信息 然而这些对用户来说都是不可见的, 如果当系统内存不足时, 这个 Activity 很容易被杀死 值得一提的是, 当 Activity 处于运行状态时,Android 会尽可能地保持它的运行, 即使出现内存不足的情况,Android 也会先杀死栈底部的 Activity, 来确保可见的 Activity 正常运行 Activity 从一种状态转变到另一种状态时会触发一些事件, 执行一些回调方法来通知状态的变化, 具体方法如下所示 : l void oncreate(bundle savedinstancestate): 创建时执行 l void onstart(): 可见时执行 l void onrestart(): 回到前台, 再次可见时执行 l void onresume(): 获取焦点时执行 l void onpause(): 失去焦点时执行 l void onstop(): 用户不可见进入后台时执行 l void ondestroy(): 销毁时执行为了让初学者更好理解 Activity 的三种状态以及不同状态时使用的方法,Google 公司专门提供了一个 Activity 生命周期模型的图例, 具体如图 3-4 所示 图 3-4 Activity 的生命周期 从图 3-4 可以看出, 当 Activity 从启动到关闭时, 会依次执行 oncreate() à onstart() à

6 onresume() à onpause() à onstop() à ondestroy() 方法 当 Activity 执行到 onpause() 方法失去焦点时, 重新调用回到前台会执行 onresume() 方法, 如果此时进程被杀死 Activity 重新执行时会先执行 oncreate() 方法 当执行到 onstop() 方法 Activity 不可见时, 再次回到前台会执行 onrestart() 方法, 如果此时进程被杀死 Activity 会重新执行 oncreate() 方法 案例 Activity 的存活 为了让初学者掌握 Activity 生命周期, 接下来通过案例 Activity 的存活 来演示 本案例实现了两个 Activity 之间的跳转时生命周期方法变化的过程, 具体步骤如下 : 1 创建程序首先创建一个名为 Activity 的存活 的应用程序, 将包名修改为 cn.itcast.activity, 设计用户交互界面, 具体如图 3-5 所示 图 3-5 第一个 Activity 界面对应布局文件 (activity01.xml) 的代码如下所示 : <RelativeLayout xmlns:android=" xmlns:tools=" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".activity01" > <Button android:layout_width="wrap_content" android:layout_centerhorizontal="true" android:layout_centervertical="true" android:onclick="click" android:text=" 开启 Activity02" /> </RelativeLayout> 2 创建第一个 Activity 界面

7 在当前项目中创建一个类 Activity01 继承自 Activity, 该类主要用于重写 Activity 的生命周期方 法, 并在每个方法中打印出 Log 以便观察, 具体代码如下所示 : 1 public class Activity01 extends Activity { 2 // 当 activity 被创建的时候调用的方法. 3 public void oncreate(bundle savedinstancestate) { 4 super.oncreate(savedinstancestate); 5 setcontentview(r.layout.activity_life01); 6 Log.i("Activity01", "oncreate()"); 7 } 8 // 当这个 activity 变成用户可见的时候调用的方法. 9 protected void onstart() { 10 super.onstart(); 11 Log.i("Activity01", "onstart()"); 12 } 13 protected void onrestart() { 14 super.onrestart(); 15 Log.i("Activity01", "onrestart()"); 16 } 17 // 当 activity 获取到焦点的时候调用的方法. 18 protected void onresume() { 19 super.onresume(); 20 Log.i("Activity01", "onresume()"); 21 } 22 // 当 activity 失去焦点的时候调用的方法 23 protected void onpause() { 24 super.onpause(); 25 Log.i("Activity01", "onpause()"); 26 } 27 // 当 activity 用户不可见的时候调用的方法. 28 protected void onstop() { 29 super.onstop(); 30 Log.i("Activity01", "onstop()"); 31 } 32 // 当 activity 被销毁的时候掉用的方法. 33 protected void ondestroy() { 34 super.ondestroy(); 35 Log.i("Activity01", "ondestroy()"); 36 } 37 // 界面中按钮的点击事件 38 public void click(view view) { 39 // 创建一个 Intent 对象, 通过该对象开启第 2 个 Activity 40 Intent intent = new Intent(this, Activity02.class); 41 startactivity(intent); 42 }

8 43 } 上述代码中, 首先重写了 Activity 生命周期中的回调方法, 通过回调方法中输出的日志来观察 Activity 生命周期的过程, 接着在 click() 方法中定义了一个 Intent 对象, 该对象用于开启另一个新的 Activity, 关于 Intent 的具体知识会在后面讲解, 在这里大家了解即可 当点击按钮时会自动触发 click(view view) 方法, 因为之前在布局文件中为 Button 定义了 onclick 属性, 它的作用就是为按钮设置点击事件, 以 onclick 属性的值为方法名创建一个方法, 在参数中传入 View 对象, 这样当点击按钮时就会触发该方法, 可以在方法中写入点击事件的逻辑 需要注意的是, 只有当布局文件中 onclick 的值与方法名一致, 并且参数中传入了 View 对象, 系统才会认为该方法是控件的点击事件方法 3 创建第二个 Activity 界面为了观察 Activity01 停止状态时的生命周期, 需要在当前项目中创建第二个 Activity, 由于不需要对第 2 个 Activity 进行界面操作, 因此新添加一个 activity02.xml 文件即可 在第 2 个 Activity 中同样实现 Activity 生命周期中的方法, 在每个方法中打印 Log 信息 1 public class Activity02 extends Activity { 2 protected void oncreate(bundle savedinstancestate) { 3 super.oncreate(savedinstancestate); 4 setcontentview(r.layout.activity02); 5 Log.i("Activity02", "oncreate()"); 6 } 7 protected void onstart() { 8 super.onstart(); 9 Log.i("Activity02", "onstart()"); 10 } 11 protected void onrestart() { 12 super.onrestart(); 13 Log.i("Activity02", "onrestart()"); 14 } 15 protected void onresume() { 16 super.onresume(); 17 Log.i("Activity02", "onresume()"); 18 } 19 protected void onpause() { 20 super.onpause(); 21 Log.i("Activity02", "onpause()"); 22 } 23 protected void onstop() { 24 super.onstop(); 25 Log.i("Activity02", "onstop()"); 26 } 27 protected void ondestroy() { 28 super.ondestroy(); 29 Log.i("Activity02", "ondestroy()"); 30 } 31 }

9 4 在清单文件中配置 Activity 在 AndroidManifest.xml 文件中注册已经创建好的 Activity, 即在清单文件中添加一个 <activity> 节点, 指定 Activity 全路径名 <application android:allowbackup="true" > <activity android:name="cn.itcast.activitybasic.activitylife01" > <intent-filter> <action android:name="android.intent.action.main" /> <category android:name="android.intent.category.launcher" /> </intent-filter> </activity> <activity android:name="cn.itcast.activitybasic.activity02" android:label=" 我是 Activity02" > </activity> </application> 需要注意的是, 在配置 Activity01 时, 需要添加一个 <intent-filter> 节点, 指定 action 和 category 让 Activity01 作为应用程序的入口 5 观察 Activity 生命周期上述操作完成后运行程序, 首先会显示第一个 Activity 界面, 如图 3-6 所示 图 3-6 第一个 Activity 界面 当图 3-6 所示的界面显示时,Log 窗口会打印 Activity01 生命周期中的执行方法, 如图 3-7 所示

10 图 3-7 第一个 Activity 生命周期从图 3-7 可以看到, 应用程序启动 Activity01 依次输出了 oncreate() onstart() onresume(), 这个顺序是第一个 Activity 从创建到显示在前台到用户可点击的过程 接下来点击图 3-6 中的 Button 按钮, 开启第二个 Activity, 如图 3-8 所示 图 3-8 第二个 Activity 界面 当第一个界面跳转到第二个界面时,Log 窗口会打印 Activity01 和 Activity02 生命周期中的执行 方法, 对应的 Log 信息, 如图 3-9 所示 图 3-9 跳转时 Activity 生命周期从图 3-9 可以看到, 当跳转到第二个界面时,Activity01 首先失去焦点执行了 onpause() 方法, 然后 Activity02 依次执行了 oncreate() onstart() onresume() 方法从创建到前台可见, 这时 Activity01 执行了 onstop() 方法 现在再观察一下从第二个 Activity 按返回键回到第一个 Activity 生命周期的 Log, 如图 3-10 所示

11 图 3-10 返回第一个 Activity 从图 3-10 可以看到, 点击返回键之后,Activity02 同样先执行了 onpause() 方法, 然后 Activity01 执行了 onrestart() onstart() onresume() 方法, 随后 Activity02 才彻底关闭, 执行了 onstop() ondestory() 在 Activity01 打开 Activity02 时,Activity01 并没有执行 finish() 方法而是执行了 onstop() 方法 因此从 Activity02 返回到 Activity01 时,Activity01 执行了 onrestart() 方法 从 Log 窗口打印的日志可以看出,Activity 失去焦点时, 首先必然会执行 onpause() 方法, 因此 项目中需要保存数据时, 可以在 onpause() 方法中保存 同时当两个 Activity 跳转时,Activity01 会先 失去焦点让 Activity02 得到焦点, 等到 Activity02 完全显示在前台时 Activity01 才会切换到后台 M 脚下留心 : 横竖屏切换时的生命周期 现实生活中, 使用手机时会根据不同情况进行横竖屏切换 当手机横竖屏切换时,Activity 会销 毁重建 ( 模拟器中横竖屏切换可以使用 ctrl+f11) 这种情况对的实际开发肯定会有影响, 如果不希望在横竖屏切换时 Activity 被销毁重建, 可以 在 AndroidManifest.xml 文件中设置 Activity 的 android:configchanges 的属性, 这样无论怎样切换 Activity 都不会销毁重新创建, 具体代码如下所示 : android:configchanges="orientation keyboardhidden screensize" 如果希望某一个界面一直处于竖屏或者横屏状态, 不随手机的晃动而改变, 同样可以在清单文 件中通过设置 Activity 的参数来完成, 具体代码如下所示 : 竖屏 :android: screenorientation="portrait" 横屏 :android: screenorientation="landscape" & 多学一招 :View 的点击事件 Android 程序中 View 的点击事件共有四种, 除了上述讲解的在布局文件中为按钮设置 onclick 属性指定点击方法名之外, 还有三种方式用于设置 View 的点击事件, 这三种方式都用到了 OnClickListener 接口, 只不过是不同形式而已 OnClickListener 是监听 View 点击事件的接口, 接口中定义控件被点击时的回调方法 onclick() View 需要在 setonclicklistener(onclicklistener listener) 方法的参数中传入 OnClickListener 接口监听 View 的点击事件 下面针对这三种形式以及 OnClickListener 接口的使用进行讲解 1 创建内部类 创建一个内部类实现 OnClickListener 接口并重写 onclick() 方法, 在方法中写入点击事件的逻辑 内部类写完之后需要为按钮设置 setonclicklistener(listener listener) 属性, 在参数中传入之前创建 好的内部类对象即可, 这样当点击按钮时就会自动触发内部类中的 onclick() 方法调用事件逻辑 这里比较重要的一点, 要为按钮设置点击事件前要先获取到该控件的引用, 需要在布局文件中 为按钮设置 id 属性, 在代码中使用 findviewbyid(r.id) 方法得到该控件的 View 对象, 最后通过强制 类型转换得到该控件, 具体代码如下 : 为控件设置 id 属性 <Button

12 为控件设置 id 属性 /> 得到控件引用, 创建内部类实现 OnClickListener 接口 protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); Button button1 = (Button) findviewbyid(r.id.button1); Button button2 = (Button) findviewbyid(r.id.button2); // 传入实现了 OnClickListener 接口的类的对象 button1.setonclicklistener(new MyButton()); button2.setonclicklistener(new MyButton()); } private class MyButton implements OnClickListener public void onclick(view v) { switch(v.getid()) { case R.id.button: Log.i(" 定义属性响应按钮点击事件 "); break; case R.id.button1: Log.i(" 定义属性响应按钮点击事件 "); break; } } } 使用这种点击事件的好处是, 当按钮较多时可以在 onclick(view v) 方法中使用 switch 语句 case 属性设置各自不同的点击事件逻辑 2 主类中实现 OnClickListener 接口除了创建内部类实现 OnClickListener 接口之外, 还可以在主类中实现该接口然后重写 onclick() 方法, 并通过 switch 语句判断是哪个按钮的被点击, 然后执行相应操作, 具体代码如下 : public class MainActivity extends Activity implements OnClickListener { protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); Button button1 = (Button) findviewbyid(r.id.button1); Button button2 = (Button) findviewbyid(r.id.button2); // 按钮绑定接口 button1.setonclicklistener(this); button2.setonclicklistener(this); } // public void onclick(view v) {

13 switch (v.getid()) { case R.id.button: Log.i(" 定义属性响应按钮点击事件 "); break; case R.id.button1: Log.i(" 定义属性响应按钮点击事件 "); break; } } } 需要注意的是,button.setOnClickListener(this); 方法中接收了一个参数 this, 这个 this 代表的是该 Activity 的引用, 由于 Activity 实现了 OnClickListener 接口, 所以在这里 this 代表了 OnClickListener 的引用, 在方法中传入 this 就代表该控件绑定了点击事件的接口 3 匿名内部类当按钮较少或者只有一个按钮时, 就不需要再单独创建一个类实现 OnclickListener 接口了, 可以直接创建 OnClickListener 的匿名内部类传入按钮的 setonclicklistener() 参数中, 具体代码如下 : Button button1 = (Button) findviewbyid(r.id.button1); button1.setonclicklistener(new OnClickListener() public void onclick(view v) { Log.i(" 定义属性响应按钮点击事件 "); } }); 按钮的点击事件学完了, 这里需要注意的是, 在实现 OnClickListener 接口时该接口在 Android 的两个包下面都有, 分别是 android.view.view 和 andriod.content.dialoginteface 要为按钮设置点击事件要导入 android.view.view 包 3.2 Activity 的启动模式 Android 采用任务栈 (Task) 的方式来管理 Activity 的实例, 当启动一个应用时,Android 就会 为之创建一个任务栈 先启动的 Activity 压在栈底, 后启动的 Activity 放在栈顶, 通过启动模式可以 控制 Activity 在任务栈中的加载情况, 本节将针对 Activity 的启动模式进行详细地讲解 Android 下的任务栈 在开发 Android 应用时, 经常会涉及一些消耗大量系统内存的情况, 例如视频播放 大量图片或者程序中开启多个 Activity 没有及时关闭等, 会导致程序出现错误 为了避免这种问题,Google 提供了一套完整的机制让开发人员控制 Android 中的任务栈 Android 系统中的任务栈, 类似于一个容器, 用于管理所有的 Activity 实例 在存放 Activity 时, 满足 先进后出 (First-In/Last-Out) 的原则 接下来通过一个图例来说明任务栈中如何存放 Activity, 如图 3-11 所示

14 进栈 出栈 Top Activity n... Base Activity1 图 3-11 Android 中的任务栈 从图 3-11 可以看出, 先加入任务栈中的 Activity 会处于容器下面, 后加入的处于容器上面, 而 从任务栈中取出 Activity 是从最顶端先取出, 最后取出的是最底端的 Activity Activity 的四种启动模式 在实际开发中, 应根据特定的需求为每个 Activity 指定恰当的启动模式 Activity 的启动模式有四种, 分别是 standard singletop singletask 和 singleinstance 在 AndroidManifest.xml 中, 通过 <activity> 标签的 android:launchmode 属性可以设置启动模式 下面针对这四种启动模式分别进行详细地讲解 1 standard 标准模式 standard 是 Activity 默认的启动模式, 在不指定 Activity 启动模式的情况下, 所有 Activity 使用的都是 standard 这种模式 因此, 前面使用的 Activity 都是 standard 启动模式 在 standard 模式下, 每当启动一个新的 Activity, 它就会进入任务栈, 并处于栈顶的位置, 对于使用 standard 模式的 Activity, 系统不会判断该 Activity 在栈中是否存在, 每次启动都会创建一个新的实例 接下来通过一个图例向大家展示 standard 模式下 Activity 在栈中的存放情况, 如图 3-12 所示 第 3 个进栈 第 2 个进栈 第 1 个进栈 第三个启动界面 Activity03 第二个启动界面 Activity02 第一个启动界面 Activity01 第 1 个出栈 第 2 个出栈 第 3 个出栈 图 3-12 standard 模式启动从图 3-12 中可以看出, 在 standard 启动模式下 Activity01 最先进栈, 其次是 Activity02, 最后是 Activity03, 出栈时,Activity03 最先出栈, 其次是 Activity02, 最后是 Activity01, 满足 先进后出 的原则 2 singletop 模式 singletop 启动模式与 standard 类似, 不同的是, 当启动的 Activity 已经位于栈顶时, 则直接使用它不创建新的实例 如果启动的 Activity 没有位于栈顶时, 则创建一个新的实例位于栈顶

15 接下来通过一个图例为大家展示 singletop 模式下 Activity 在栈中的存放情况, 如图 3-13 所示 当再次启动的界面位于栈顶, 则复用 Activity03 当再次启动的界面不位于栈顶, 则重新创建实例 Activity04 第 3 个进栈 第 2 个进栈 第 1 个进栈 第三个启动界面 Activity03 第二个启动界面 Activity02 第一个启动界面 Activity01 图 3-13 singletop 启动模式从图 3-13 中可以看出, 当前栈顶中的元素是 Activity03, 如果再次启动的界面还是 Activity03, 则复用当前栈顶的 Activity 实例, 如果再次启动的界面没有位于栈顶, 则会重新创建一个实例 3 singletask 模式如果希望 Activity 在整个应用程序中只存在一个实例, 可以使用 singletask 模式, 当 Activity 的启动模式指定为 singletask, 每次启动该 Activity 时, 系统首先会检查栈中是否存在该活动的实例, 如果发现已经存在则直接使用该实例, 并将当前 Activity 之上的所有 Activity 出栈, 如果没有发现则创建一个新的实例 接下来通过一个图例为大家展示 singletask 模式下 Activity 在栈中的存放情况, 如图 3-14 所示 启动 Activity02, 移除 Activity02 之前的实例, 复用 Activity02 Activity02 第 3 个进栈 第 2 个进栈 第 1 个进栈 第三个启动界面 Activity03 第二个启动界面 Activity02 第一个启动界面 Activity01 移除 Activity03 图 3-14 singletask 模式从图 3-14 可以看出, 当再次启动 Activity02 时, 并没有新创建实例, 而是将 Activity03 实例移除, 复用 Activity02 实例, 这就是 singletask 模式, 让某个 Activity 在当前栈中只存在一个实例 4 singleinstance 模式在程序开发中, 如果需要 Activity 在整个系统中都只有一个实例, 这时就需要用到 singleinstance 模式, 不同于上述三种模式, 指定为 singleinstance 模式的 Activity 会启动一个新的任务栈来管理这个 Activity

16 singleinstance 模式加载 Activity 时, 无论从哪个任务栈中启动该 Activity, 只会创建一个 Activity 实例, 并且会使用一个全新的任务栈来装载该 Activity 实例 采用这种模式启动 Activity 会分为以下两种情况, 具体如下 : 第一种 : 如果要启动的 Activity 不存在, 系统会先创建一个新的任务栈, 再创建该 Activity 的实例, 并把该 Activity 加入栈顶, 如图 3-15 所示 任务栈 A 任务栈 B 第一次打开 Activity01 Activity01 第二次打开 Activity02 开启的任务栈 Activity02 图 3-15 第一种情况第二种 : 如果要启动的 Activity 已经存在, 无论位于哪个应用程序或者哪个任务栈中 系统都会把该 Activity 所在的任务栈转到前台, 从而使该 Activity 显示出来 至此,Activity 的四种启动模式已经讲解完成, 在实际开发中, 需要根据实际情况来选择合适的启动模式即可 3.3 在 Activity 中使用 Intent Intent 介绍 通信技术不发达时, 人们通过信件的方式互相通信, 其中邮递员就起到了传递信息的作用 在 Android 系统中, 组件之间也可以完成通信功能, 此时就需要使用 Intent Intent 中文翻译为 意图,Intent 最常见的用途是绑定应用程序组件, 并在应用程序之间进行通信 Intent 一般用于启动 Activity 启动服务 发送广播等, 承担了 Android 应用程序三大核心组件相互间的通信功能 接下来通过一个表来列举 Intent 启动组件的常用的方法, 具体如表 3-1 所示 表 3-1 Intent 开启的三个组件方法声明功能描述 startactivity(intent intent) Activity startactivityforresult(intent intent) ComponentName startservice(intent intent) Service boolean bindservice(intent service,serviceconnection conn,int flags) sendbroadcast(intent intent) BroadcastReceiver sendbroadcast(intent intent,string receiverpermission) sendorderedbroadcast(intent intent,string receiverpermission) 在表 3-1 中, 列举了通过 Intent 来开启不同组件的常用方法, 需要注意的是, 使用 Intent 开启 Activity 和开启 Service 只有两个方法, 而开启 BroadcastReceiver 有多个方法, 在此只列举了三个常用的方法, 初学者感兴趣可以自己查阅相关 API 进行学习

17 3.3.2 显式意图和隐式意图 Android 中 Intent 寻找目标组件的方式分为两种, 一种是显式意图和一种是隐式意图 接下来分别针对这两种意图进行详细地讲解 1 显式意图显式意图, 即在通过 Intent 启动 Activity 时, 需要明确指定激活组件的名称 在程序中, 如果需要在本应用中启动其他的 Activity 时, 可以使用显式意图来启动 Activity, 其示例代码具体如下 : Intent intent = new Intent(this, Activity02.class);// 创建 Intent 对象 startactivity(intent); // 开启 Activity 在上述示例代码中, 通过 Intent 的构造方法来创建 Intent 对象 构造方法接收两个参数, 第一个参数 Context 要求提供一个启动 Activity 的上下文, 第二个参数 Class 则是指定要启动的目标 Activity, 通过构造方法就可以构建出 Intent 对象 除了通过指定类名开启组件外, 显式意图还可以根据目标组件的包名 全路径名来指定开启组件, 代码如下所示 : intent.setclassname("cn.itcast.xxx","cn.itcast.xxx.xxxx"); startactivity(intent); 在上述实例代码中, 通过 setclassname( 包名, 类全路径名 ) 函数指定要开启组件的包名和全路径名来启动另一个组件 Activity 类中提供了一个 startactivity(intent intent) 方法, 该方法专门用于开启 Activity, 它接收一个 Intent 参数, 这里将构建好的 Intent 传入该方法即可启动目标 Activity 使用这种方式开启的 Activity, 意图 非常明显, 因此称之为显式意图 2 隐式意图没有明确指定组件名的 Intent 称为隐式意图 Android 系统会根据隐式意图中设置的动作 (action) 类别 ( category) 数据 ( Uri 和数据类型 ) 找到最合适的组件 具体代码如下所示 : <activity android:name="com.itcast.intent.activity02"> <intent-filter> <!-- 设置 action 属性, 需要在代码中根据所设置的 name 打开指定的组件 --> <action android:name="cn.itscast.xxx"/> <category android:name="android.intent.category.default"/> </intent-filter> </activity> 在上述代码中,<action> 标签指明了当前 Activity 可以响应的动作为 "cn.itscast.xxx", 而 <category> 标签则包含了一些类别信息, 只有当 <action> 和 <category> 中的内容同时匹配时,Activity 才会被开启 使用隐示意图开启 Activity 的示例代码如下所示 : Intent intent = new Intent(); // 设置动作和清单文件一样 intent.setaction("cn.itscast.xxx"); startactivity(intent); 在上述代码中,intent 指定了 setaction( cn.itscast.xxx ); 这个动作, 但是并没有指定 category, 这是因为清单文件中配置的 "android.intent.category.default" 是一种默认的 category, 在调用 startactivity() 方法时, 会自动将这个 category 添加到 Intent 中

18 在上述两种意图中, 显式意图开启组件时必须要指定组件的名称, 一般只在本应用程序切换组 件时使用 而隐式意图的功能要比显式意图更加强大, 不仅可以开启本应用的组件还可以开启其他 应用的组件, 例如打开系统自带的照相机 浏览器等 案例 打开系统照相机 在实际开发中, 避免不了要调用其他应用程序的组件 例如, 在开发新浪微博时, 需要启动系统的相机功能 通过前面的讲解可知, 使用隐式意图可启动其他应用程序的组件 接下来通过案例 打开系统照相机 向大家演示如何使用隐式意图, 具体步骤如下 : 1 创建程序创建一个名为 打开系统照相机 的 Android 工程, 将包名修改为 cn.itcast.opencamera 设计用户交互界面, 具体如图 3-16 所示 图 3-16 程序主界面程序对应布局文件 (activity_main.xml) 的代码如下所示 : <RelativeLayout xmlns:android=" xmlns:tools=" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".mainactivity" > <Button android:id="@+id/opencamera" android:layout_width="wrap_content" android:layout_centerhorizontal="true" android:layout_centervertical="true" android:text=" 打开照相机 " /> </RelativeLayout> 2 清单文件中的配置

19 由于模拟器打开系统相机会直接报错, 为了能让初学者在模拟器上看到效果, 因此在这里创建 一个 Activity02 用来模拟系统相机 具体代码如下所示 : <activity android:name="cn.itcast.opencamera.activity02" > <intent-filter> <action android:name="android.media.action.image_capture" /> <category android:name="android.intent.category.default" /> </intent-filter> </activity> 需要注意的是, 这里配置的 action 和 category 与系统相机的 action 和 category 一致 当使用隐 式意图来开启 Activity 时, 系统会找到两个符合条件的 Activity, 因此会弹出一个选择的对话框, 让 用户来选择要打开的页面 3 隐式意图开启照相机 在 MainActivity 中, 通过隐式意图开启系统中的照相机, 具体代码如下所示 : 1 public class MainActivity extends Activity { 2 protected void oncreate(bundle savedinstancestate) { 3 super.oncreate(savedinstancestate); 4 setcontentview(r.layout.activity_main); 5 // 获取界面上的按钮 6 Button button = (Button) findviewbyid(r.id.opencamera); 7 // 给 Button 按钮添加点击事件 8 button.setonclicklistener(new OnClickListener() { 9 public void onclick(view v) { 10 Intent intent = new Intent(); 11 intent.setaction("android.media.action.image_capture"); 12 intent.addcategory("android.intent.category.default"); 13 startactivity(intent); 14 } 15 }); 16 } 17 } 上述代码中, 实现了通过隐式意图开启照相机的功能 通过 setaction 设置需要开启 Activity 的 动 作 为 "android.media.action.image_capture", addcategory 设 置 类 别 "android.intent.category.default" 4 运行程序打开系统相机 接下来运行程序, 点击屏幕中的 打开照相机 按钮, 如图 3-17 所示

20 图 3-17 打开照相机在图 3-17 中, 当点击屏幕中的按钮后出现了一个选择界面, 左侧是系统照相机, 而右侧是自己创建的 Activity, 出现这种情况的原因是,Activity02 在清单文件中注册的 action 和 addcategory 是和系统中照相机一样 因此, 当用隐式意图找目标组件时, 会将自己创建的照相机和系统自带的照相机都显示在界面中 3.4 Activity 中的数据传递 数据传递方式 在 Android 开发中, 经常要在 Activity 之间传递数据 通过前面的讲解可知,Intent 可以用来开启 Activity, 同样它也可以用来在 Activity 之间传递数据 使用 Intent 传递数据只需调用 putextra() 方法将想要存储的数据存在 Intent 中即可 当启动了另一个 Activity 后, 再把这些数据从 Intent 中取出即可 例如 Activity01 中存储了一个字符串, 现在要将这个字符串传递到 Activity02 中, 可以使用如下代码 : String data = "Hello Activity02" Intent intent = new Intent(this,Activity02.class); intent.putextra("extra_data",data); startactivity(intent); 在上述代码中, 通过显式意图开启的 Activity02, 并通过 putextra() 方法传递了一个字符串 data putextra() 方法中第一个参数接收的是 key, 第二个参数接收的是 value 如果想要在 Activity02 中取出传递过来的数据, 可以使用如下代码 : Intent intent = getintent(); String data = = intent.getstringextra("extra_data"); Log.i("Activity02", data); 上述这种数据传递方式是最简单的一种数据传递方式, 还有一种传递数据的方式是调用 putextras() 方法传递数据, 该方法传递的是 Bundle 对象 调用 putextras() 方法传递数据可以使用如下代码 :

21 Bundle bundle = new Bundle(); bundle.putstring("name", "Linda"); bundle.putint("age", 20); Intent intent = new Intent(this,Activity02.class); intent.putextras(bundle); startactivity(intent); 如果想要在 Activity02 中取出上述方式传递的数据, 可以使用如下代码 : Intent intent = getintent(); Bundle bundle = intent.getextras(); String stuname = bundle.getstring("name"); int stuage = bundle.getstring("age"); 在上述代码中, 在接收 Bundle 对象封装的数据时, 需要先创建对应的 Bundle 对象, 然后再根据存入的 key 值取出 value 其实用 Intent 传递数据以及对象时, 它的内部也是调用了 Bundle 对象相应的 put() 方法, 也就是说 Intent 内部也是用 Bundle 来实现数据传递的, 只是封装了一层而已 案例 用户注册 为了让初学者掌握 Activity 中的数据传递, 接下来通过 用户注册 的案例来演示 Activity 中的数据传递, 案例实现的步骤如下 : 1 创建程序创建一个名为 用户注册 的应用程序, 将包名修改为 cn.itcast.passdata, 设计用户交互界面, 具体如图 3-18 所示 图 3-18 第一个 Activity 界面第一个 Activity 对应布局文件 (activity01.xml) 的代码如下所示 : <RelativeLayout xmlns:android=" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" >

22 <LinearLayout android:layout_width="match_parent" android:layout_centerhorizontal="true" android:layout_marginleft="10dp" android:layout_marginright="10dp" android:layout_margintop="22dp" android:orientation="horizontal" > <TextView android:layout_width="80dp" android:gravity="right" android:paddingright="5dp" android:text=" 用户名 :" /> <EditText android:layout_width="match_parent" android:hint=" 请输入您的用户名 " android:textsize="14dp" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_centerhorizontal="true" android:layout_marginleft="10dp" android:layout_marginright="10dp" android:layout_margintop="5dp" android:orientation="horizontal" > <TextView android:layout_width="80dp" android:gravity="right" android:paddingright="5dp" android:text=" 密码 :" /> <EditText android:layout_width="match_parent" android:hint=" 请输入您的密码 " android:inputtype="textpassword"

23 android:textsize="14dp" /> </LinearLayout> <RadioGroup android:layout_width="wrap_content" android:layout_marginleft="30dp" android:contentdescription=" 性别 " android:orientation="horizontal" > <RadioButton android:layout_width="wrap_content" android:checked="true" android:text=" 男 " > </RadioButton> <RadioButton android:layout_width="wrap_content" android:text=" 女 " /> </RadioGroup> <Button android:layout_width="wrap_content" android:layout_centerhorizontal="true" android:layout_margintop="24dp" android:text=" 提交用户信息 " /> </RelativeLayout> 在上述代码中, 定义了一个相对布局 RelativeLayout, 该布局中创建了一个 EditText 和一个 Button 按钮, 分别用于输入内容和点击发送按钮进行数据传递 2 创建接收数据 Activity 界面接下来在 PassData 程序中创建一个用于数据接收的界面 activity02.xml, 该界面的布局比较简单, 只添加了三个 TextView 用来展示用户信息, 因此不展示界面效果,activity02.xml 界面代码如下所示 : <LinearLayout xmlns:android=" xmlns:tools=" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <TextView android:id="@+id/tv_name"

24 android:layout_width="wrap_content" android:gravity="center" android:layout_margintop="10dp" android:textsize="20dp" /> <TextView android:layout_width="wrap_content" android:gravity="center" android:layout_margintop="10dp" android:textsize="20dp" /> <TextView android:layout_width="wrap_content" android:gravity="center" android:layout_margintop="10dp" android:textsize="20dp" /> </LinearLayout> 2 编写界面交互代码(MainActivity) 当界面创建好之后, 需要在 Activity01 中编写与页面交互的代码, 用于实现数据传递, 具体代码如下所示 : 1 public class Activity01 extends Activity{ 2 private RadioButton manradio; 3 private RadioButton womanradio; 4 private EditText et_password; 5 private Button btn_send; 6 private EditText et_name; 7 protected void oncreate(bundle savedinstancestate) { 8 super.oncreate(savedinstancestate); 9 setcontentview(r.layout.activity01); 10 et_name = (EditText) findviewbyid(r.id.et_name); 11 et_password = (EditText) findviewbyid(r.id.et_password); 12 btn_send = (Button) findviewbyid(r.id.btn_send); 13 manradio = (RadioButton) findviewbyid(r.id.radiomale); 14 womanradio = (RadioButton) findviewbyid(r.id.radiofemale); 15 btn_send = (Button) findviewbyid(r.id.btn_send); 16 // 点击发送按钮进行数据传递 17 btn_send.setonclicklistener(new OnClickListener() { 18 public void onclick(view v) { 19 passdate(); 20 } 21 });

25 22 } 23 // 传递数据 24 public void passdate() { 25 // 创建 Intent 对象, 启动 Activity02 26 Intent intent = new Intent(this, Activity02.class); 27 // 将数据存入 Intent 对象 28 intent.putextra("name", et_name.gettext().tostring().trim()); 29 intent.putextra("password", et_password.gettext().tostring().trim()); 30 String str = ""; 31 if(manradio.ischecked()){ 32 str = " 男 "; 33 }else if(womanradio.ischecked()){ 34 str = " 女 "; 35 } 36 intent.putextra("sex", str); 37 startactivity(intent); 38 } 39 } 在上述代码中,passDate() 方法实现了获取用户输入数据, 并且将 Intent 作为载体进行数据传递 为了让初学者看到数据传递效果, 接下来再创建一个 Activity02, 用于接收数据并展示, 具体代码如 下所示 : 1 public class Activity02 extends Activity { 2 private TextView tv_name; 3 protected void oncreate(bundle savedinstancestate) { 4 super.oncreate(savedinstancestate); 5 setcontentview(r.layout.activity02); 6 // 拿到 Intent 对象 7 Intent intent=getintent(); 8 // 取出 key 对应的 value 值 9 String name = intent.getstringextra("name"); 10 String password = intent.getstringextra("password"); 11 String sex = intent.getstringextra("sex"); 12 tv_name =(TextView) findviewbyid(r.id.tv_name); 13 tv_password = (TextView) findviewbyid(r.id.tv_password); 14 tv_sex = (TextView) findviewbyid(r.id.tv_sex); 15 tv_name.settext(" 用户名 :"+name); 16 tv_password.settext(" 密 码 :"+password); 17 tv_sex.settext(" 性 别 :"+sex); 18 } 19 } 在上述代码中, 第 7-17 行代码通过 getintent() 方法获取到 Intent 对象, 然后通过该对象的 getstringextra() 方法拿到输入的用户名, 并将得到的用户名绑定在 TextView 控件中进行显示 需要 注意的是,getStringExtra(String str) 方法传入的参数必须是 Activity01 中 intent.putextra() 方法中传入 的 key, 否则会返回 null

26 3 清单文件的配置接下来在清单文件中, 配置 Activity, 具体代码如下所示 : <application android:allowbackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/apptheme" > <activity android:name="cn.itcast.passdata.activity01" android:label=" 填写用户信息 " > <intent-filter> <action android:name="android.intent.action.main" /> <category android:name="android.intent.category.launcher" /> </intent-filter> </activity> <activity android:name="cn.itcast.passdata.activity02" android:label=" 展示用户信息 " > </activity> </application> 需要注意的是,android:label 属性使用来指定显示在标题栏上的名称的, 如果 Activity 设置了该属性, 则跳到该 Activity 页面时标题栏会显示在 Activity 中配置的名称, 否则显示在 Application 中配置的名称 3 运行程序注册信息程序编写完成后, 接下来运行程序进行测试, 首先在 Activity01 的文本框中输入 Linda, 点击 发送数据 按钮, 此时会跳转到 Activity02 界面, 显示输入的信息, 如图 3-19 所示 图 3-19 注册用户运行界面 从图 3-19 中可以看出,Activity01 中输入的数据 Linda 成功的传递给 Activity02, 这就是使

27 用 Intent 进行不同界面传递数据的用法 回传数据 在使用新浪微博 APP 时, 能发现在微博发布页面进入图库选择图片后, 会回到微博发布页面并带回了图片选择页面的图片信息 由于这种需求十分常见, 因此 Andorid 提供了一个 startactivityforresult() 方法, 来实现回传数据 接下来通过一段示例代码来显示如何使用 startactivityforresult(),activity01 具体代码如下所示 : Intent intent = new Intent(this,Activity02.class); startactivityforresult(intent,1); 上述示例代码中,startActivityForResult() 方法接收两个参数, 第一个参数是 Intent, 第二个参数是请求码, 用于在判断数据的来源 接下来在 Activity02 中添加数据返回的示例代码, 具体如下所示 : Intent intent = new Intent(); intent.putextra("extra_data","hello Activity01"); setresult(1,intent); finish(); 上述代码中, 实现了回传数据的功能 其中 setresult() 方法接收两个参数, 第一个参数 resultcode 结果码, 一般使用 0 或 1 第二个参数则是把带有数据的 Intent 传递回去, 最后调用 finish() 方法销毁当前 Activity 由于使用了 startactivityforresult() 方法启动 Activity02, 因此会在 Actiivity01 页面回调 onactivityresult() 方法, 需要在 Activity01 中重写该方法来获取返回的数据, 具体代码如下所示 : protected void onactivityresult(int requestcode, int resultcode, Intent data) { super.onactivityresult(requestcode, resultcode, data); if (resultcode == 1) { String data = data.getstringextra("extra_data"); Log.i("Activity01",data); } } 在上述代码中, 实现了获取返回数据的功能 onactivityresult() 方法有三个参数, 第一个参数 requestcode, 表示在启动 Activity 时传递的请求码 ; 第二个参数 resultcode, 表示在返回数据时传入结果码 ; 第三个参数 data, 表示携带返回数据的 Intent 需要注意的是, 在一个 Activity 中很可能调用 startactivityforresult() 方法启动多个 Activity, 每一个 Activity 返回的数据都会回调到 onactivityresult() 这个方法中, 因此, 首先要做的就是通过检查 requestcode 的值来判断数据来源, 确定数据是从 Activity02 返回的, 然后再通过 resultcode 的值来判断数据处理结果是否成功, 最后从 data 中取出数据并打印, 这样就完成了 Activity 中数据返回的功能 案例 装备选择 为了让初学者掌握 Activity 回传数据, 接下来通过案例装备选择来演示 Activity 回传数据 本案 例实现了购买装备增加生命值的功能, 实现案例的具体步骤如下 : 1 创建程序

28 创建一个名为 装备选择 的工程, 将包名修改为 cn.itcast.select 设计用户交互界面, 具体如 图 3-20 所示 图 3-20 装备选择主界面装备选择程序对应的布局文件 (activity_main.xml) 如下所示 : <LinearLayout xmlns:android=" xmlns:tools=" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:gravity="center" tools:context=".mainactivity" > <ImageView android:id="@+id/pet_imgv" android:layout_width="wrap_content" android:layout_gravity="center_horizontal" android:layout_marginbottom="5dp" android:layout_margintop="30dp" android:src="@drawable/baby" /> <TextView android:id="@+id/pet_dialog_tv" android:layout_width="wrap_content" android:layout_gravity="center_horizontal" android:layout_marginbottom="25dp" android:gravity="center" android:text=" 主人, 快给小宝宝购买装备吧 " /> <TableLayout android:layout_width="fill_parent"

29 android:layout_gravity="center" android:layout_marginbottom="20dp" > <TableRow android:layout_width="fill_parent" > <TextView android:layout_width="0dip" android:layout_weight="1" android:text=" 生命值 :" android:textsize="14sp" /> <ProgressBar style="?android:attr/progressbarstylehorizontal" android:layout_width="0dip" android:layout_gravity="center" android:layout_weight="2" /> <TextView android:layout_width="0dip" android:layout_weight="1" android:text="0" android:gravity="center" android:textcolor="#000000" /> </TableRow> <TableRow android:layout_width="fill_parent" > <TextView android:layout_width="0dip" android:layout_weight="1" android:text=" 攻击力 :" android:textsize="14sp" /> <ProgressBar style="?android:attr/progressbarstylehorizontal" android:layout_width="0dip"

30 android:layout_weight="2" /> <TextView android:layout_width="0dip" android:layout_weight="1" android:text="0" android:gravity="center" android:textcolor="#000000" /> </TableRow> <TableRow android:layout_width="fill_parent" > <TextView android:layout_width="0dip" android:layout_weight="1" android:text=" 敏捷 :" android:textsize="14sp" /> <ProgressBar style="?android:attr/progressbarstylehorizontal" android:layout_width="0dip" android:layout_weight="2" /> <TextView android:layout_width="0dip" android:layout_weight="1" android:text="0" android:gravity="center" android:textcolor="#000000" /> </TableRow> </TableLayout> <RelativeLayout android:layout_width="match_parent" > <Button android:layout_width="wrap_content" android:layout_alignparentleft="true"

31 android:layout_alignparenttop="true" android:onclick="click" android:drawablepadding="3dp" android:text=" 主人购买装备 " android:textsize="14sp" /> <Button android:layout_width="wrap_content" android:layout_alignparentright="true" android:layout_alignparenttop="true" android:drawablepadding="3dp" android:onclick="click2" android:text=" 小宝宝购买装备 " android:textsize="14sp" /> </RelativeLayout> </LinearLayout> 上述布局代码使用到了控件 ProgressBar( 进度条 ), 它是用来显示小宝宝的生命值 攻击力和敏捷度的 ProgressBar 通常用于访问网络展示 loading 对话框以及下载文件时显示的进度 它有两种表现形式, 一种是水平的 ( 即本案例用到的 ), 另一种是环形的 它的表现形式是由 style 属性控制的,ProgressBar 几个常用方法属性如下所示 : l style 属性 : 控制 ProgressBar 的表现形式, 水平进度条需设置 style 的属性值为 "?android:attr/progressbarstylehorizontal", 环形进度条需设置 style 的属性值为 "?android:attr/progressbarstylelarge"; l setmax() 方法 : 设置进度条的最大值 ; l setprogress() 方法 : 设置当前进度 ; l getprogress() 方法 : 拿到当前进度 ; 2 创建装备界面创建装备界面 activity_shop.xml, 该界面是用来展示装备的, 界面编写完成后, 运行效果如图 3-21 所示

32 图 3-21 购买装备页面购买装备界面 (activity_shop.xml) 对应的布局文件如下所示 : <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android=" android:id="@+id/rl" android:layout_width="match_parent" android:orientation="vertical" > <View android:layout_width="30dp" android:layout_height="30dp" android:background="@android:drawable/ic_menu_info_details" android:layout_centervertical="true" android:layout_alignparentleft="true"/> <TextView android:id="@+id/tv_name" android:layout_width="wrap_content" android:layout_centervertical="true" android:layout_marginleft="60dp" android:text=" 商品名称 "/> <LinearLayout android:layout_width="wrap_content" android:layout_centerinparent="true" android:orientation="vertical"> <TextView android:id="@+id/tv_life" android:layout_width="wrap_content"

33 android:textsize="13sp" android:text=" 生命值 "/> <TextView android:layout_width="wrap_content" android:textsize="13sp" android:text=" 攻击力 "/> <TextView android:layout_width="wrap_content" android:textsize="13sp" android:text=" 速度 "/> </LinearLayout> </RelativeLayout> 3 创建 ItemInfo 类在程序中创建一个 cn.itcast.domain 包, 在该包中创建一个 ItemInfo 类, 用于封装装备信息, 具体代码如下所示 : 1 public class ItemInfo implements Serializable{ 2 private String name; 3 private int acctack; 4 private int life; 5 private int speed; 6 public ItemInfo(String name, int acctack, int life, int speed) { 7 this.name = name; 8 this.acctack = acctack; 9 this.life = life; 10 this.speed = speed; 11 } 12 public String getname() { 13 return name; 14 } 15 public void setname(string name) { 16 this.name = name; 17 } 18 public int getacctack() { 19 return acctack; 20 } 21 public void setacctack(int acctack) { 22 this.acctack = acctack; 23 } 24 public int getlife() {

34 25 return life; 26 } 27 public void setlife(int life) { 28 this.life = life; 29 } 30 public int getspeed() { 31 return speed; 32 } 33 public void setspeed(int speed) { 34 this.speed = speed; 35 } 36 public String tostring() { 37 return " [name=" + name + ", acctack=" + acctack + ", life=" + life 38 + ", speed=" + speed + "]"; 39 } 40 } 需要注意的是,Intent 除了传递基本类型之外, 只能传递 Serializable 或 Parcelable 类型的数据 为了方便数据传递, 在这里让 ItemInfo 类实现 Serializable 接口 4 创建 ShopActivity ShopActivity 是用来展示装备信息的, 当点击 ShopActivity 的装备时, 会调回 MainActivity 并将 装备信息回传给 MainActivity,ShopActivity 的具体代码如下所示 : 1 public class ShopActivity extends Activity implements OnClickListener { 2 private ItemInfo iteminfo; 3 protected void oncreate(bundle savedinstancestate) { 4 super.oncreate(savedinstancestate); 5 setcontentview(r.layout.activity_shop); 6 iteminfo = new ItemInfo(" 金剑 ", 100, 20, 20); 7 findviewbyid(r.id.rl).setonclicklistener(this); 8 TextView mlifetv = (TextView)findViewById(R.id.tv_life); 9 TextView mnametv = (TextView)findViewById(R.id.tv_name); 10 TextView mspeedtv = (TextView)findViewById(R.id.tv_speed); 11 TextView mattacktv = (TextView) findviewbyid(r.id.tv_attack); 12 //TextView 显示字符串, 这里传入 int 值编译不会报错, 运行会出错 13 mlifetv.settext(" 生命值 +"+iteminfo.getlife() ); 14 mnametv.settext(iteminfo.getname() + ""); 15 mspeedtv.settext(" 敏捷度 +"+iteminfo.getspeed()); 16 mattacktv.settext(" 攻击力 +"+iteminfo.getacctack()); 17 } 19 public void onclick(view v) { 20 // TODO Auto-generated method stub 21 switch (v.getid()) { 22 case R.id.rl: 23 Intent intent = new Intent();

35 24 intent.putextra("equipment", iteminfo); 25 setresult(1, intent); 26 finish(); 27 break; 28 } 29 } 30 } 上述代码中的重点代码是第 行, 从这段代码中可以看出, 使用 setresult() 方法跳转 Activity 不需要指定要跳转的 Activity setreult() 方法的作用是让当前 Activity 返回到它的调用者, 在这里可 以理解为让 ShopActivity 返回到 MainActivity 5 编写界面交互代码(MainActivity) 接下来编写 MainActivity,MainActivity 主要用于响应按钮的点击事件, 并将返回的装备信息显 示到指定的 ListView 控件中, 具体代码如下所示 : 1 public class MainActivity extends Activity { 2 private ProgressBar mprogressbar1; 3 private ProgressBar mprogressbar2; 4 private ProgressBar mprogressbar3; 5 private TextView mlifetv; 6 private TextView mattacktv; 7 private TextView mspeedtv; 8 protected void oncreate(bundle savedinstancestate) { 9 super.oncreate(savedinstancestate); 10 setcontentview(r.layout.activity_main); 11 mlifetv = (TextView) findviewbyid(r.id.tv_life_progress); 12 mattacktv = (TextView) findviewbyid(r.id.tv_attack_progress); 13 mspeedtv = (TextView) findviewbyid(r.id.tv_speed_progress); 14 initprogress(); // 初始化进度条 15 } 16 private void initprogress() { 17 mprogressbar1 = (ProgressBar) findviewbyid(r.id.progressbar1); 18 mprogressbar2 = (ProgressBar) findviewbyid(r.id.progressbar2); 19 mprogressbar3 = (ProgressBar) findviewbyid(r.id.progressbar3); 20 mprogressbar1.setmax(1000); // 设置最大值 mprogressbar2.setmax(1000); 22 mprogressbar3.setmax(1000); 23 } 24 // 开启新的 activity 并且想获取他的返回值 25 public void click(view view) { 26 Intent intent = new Intent(this, ShopActivity.class); 27 startactivityforresult(intent, 1); // 返回请求结果, 请求码为 1 28 } 29 public void click2(view view) { 30 Intent intent = new Intent(this, ShopActivity.class); 31 startactivityforresult(intent, 1);

36 32 } 34 protected void onactivityresult(int requestcode, 35 int resultcode, Intent data) { 36 super.onactivityresult(requestcode, resultcode, data); 37 if (data!= null) { 38 // 判断结果码是否等于 1, 等于 1 为主人添加装备, 等于 2 为宝宝添加装备 39 if (resultcode == 1) { 40 if (requestcode == 1) { 41 ItemInfo info= 42 (ItemInfo) data.getserializableextra("equipment"); 43 // 更新 ProgressBar 的值 44 updateprogress(info); 45 } 46 } 47 } 48 } 49 // 更新 ProgressBar 的值 50 private void updateprogress(iteminfo info) { 51 int progress1 = mprogressbar1.getprogress(); 52 int progress2 = mprogressbar2.getprogress(); 53 int progress3 = mprogressbar3.getprogress(); 54 mprogressbar1.setprogress(progress1+info.getlife()); 55 mprogressbar2.setprogress(progress2+info.getacctack()); 56 mprogressbar3.setprogress(progress3+info.getspeed()); 57 mlifetv.settext(mprogressbar1.getprogress()+""); 58 mattacktv.settext(mprogressbar2.getprogress()+""); 59 mspeedtv.settext(mprogressbar3.getprogress()+""); 60 } 61 } 上述代码中第 行, 实现了获取 ShopActivity 的装备信息, 根据装备信息更新 ProgressBar 6 清单文件的配置 使用 Activity 时需要在清单文件中配置, 具体代码如下所示 : <activity android:name="cn.itcast.select.mainactivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.main" /> <category android:name="android.intent.category.launcher" /> </intent-filter> </activity> <activity android:name="cn.itcast.select.shopactivity" > </activity> 7 运行程序选择装备

37 运行程序, 在主界面中分别点击 主人购买装备 小宝宝购买装备 按钮, 此时会跳转至装 备展示界面, 装备购买成功后会看到如图 3-22 所示的界面 图 3-22 选择装备从图 3-22 可以看出, 主人购买装备或小宝宝购买装备都完成了, 购买的装备会显示在界面的 ListView 中, 并且进度条的值会随着装备的购买而增加 至此,Activity 数据传递的功能就讲解完了 3.5 本章小结 本章主要讲解了 Activity 的相关知识, 包括 Activity 入门 Activity 启动模式 Intent 的使用以及 Activity 中的数据传递, 并在讲解各个知识点时都编写了实用的案例用来巩固知识点 由于凡是有界 面的 Android 程序都会使用到 Activity, 因此, 要求初学者必须熟练掌握该组件的使用 3.6 习题 一 填空题 1 Activity 生命周期的三种状态分别是 和 2 Activity 的四种启动模式是 和 3 Android 中 Intent 寻找目标组件的方式有两种 和 4 Activity 生命周期中 回到前台, 再次可见时执行 时调用的方法是 5 Andorid 提供了一个 方法来实现回传数据 二 判断题 1 Activity 是 Android 应用程序的四大组件之一 ( ) 2 Intent 一般只用于启动 Activity 不能开启广播和服务 ( ) 3 Intent 可以用来开启 Activity, 同样它也可以用来在 Activity 之间传递数据 ( ) 4 Activity 默认的启动模式是 singletop 模式 ( ) 5 在数据传递时, 如果需要获取返回的数据, 需要使用 onactivityresult() 方法 ( )

38 三 选择题 1 一个应用程序默认会包含( ) 个 Activity A 1 个 B 5 个 C 10 个 D 若干个 2 下列方法中,Activity 从启动到关闭不会执行的是 ( ) A oncreate() B onstart() C onresume() D onrestart() 3 下列组件中, 不能使用 Intent 启动的是 ( ) A Activity B 启动服务 C 广播 D 内容提供者 4 startactivityforresult() 方法接收两个参数, 第一个是 Intent, 第二个是 ( ) A resultcode B requestcode C 请求码 D data 5 下列关于 Activity 的描述, 错误的是 ( ) A Activity 是 Android 的四大组件之一 B Activity 有四种启动模式 C Activity 通常用于开启一个广播事件 D Activity 就像一个界面管理员, 用户在界面上的操作是通过 Activity 来管理 四 简答题 1 请简要说明 Activity 四种启动模式的区别 2 请简要说明 Activity 的三种状态以及不同状态使用的方法 五 编程题 1 请编写一个程序, 通过隐式意图打开系统中的浏览器 2 请编写一个数据传递的小程序, 要求在第一个界面输入姓名 年龄, 第二个界面上面显示 恭喜您! 来到这个世界 n 年!

教案模板4-2

教案模板4-2 传智播客 Android 移动应用基础教程 教学设计 课程名称 : Android 移动应用基础教程授课年级 : 2015 年级授课学期 : 2015 学年第一学期教师姓名 : 某某老师 2014 年 10 月 09 日 课题名称第 3 章 Activity 计划学时 8 学时 内容分析 在现实生活中, 经常会使用手机进行打电话 发短信 玩游戏等, 这就需要与手机界 面进行交互 在 Android

More information

res/layout 目录下的 main.xml 源码 : <?xml version="1.0" encoding="utf 8"?> <TabHost android:layout_height="fill_parent" xml

res/layout 目录下的 main.xml 源码 : <?xml version=1.0 encoding=utf 8?> <TabHost android:layout_height=fill_parent xml 拓展训练 1- 界面布局 1. 界面布局的重要性做应用程序, 界面是最基本的 Andorid 的界面, 需要写在 res/layout 的 xml 里面, 一般情况下一个 xml 对应一个界面 Android 界面布局有点像写 html( 连注释代码的方式都一样 ), 要先给 Android 定框架, 然后再在框架里面放控件,Android 提供了几种框架,AbsoluteLayout,LinearLayout,

More information

主程式 : public class Main3Activity extends AppCompatActivity { ListView listview; // 先整理資料來源,listitem.xml 需要傳入三種資料 : 圖片 狗狗名字 狗狗生日 // 狗狗圖片 int[] pic =new

主程式 : public class Main3Activity extends AppCompatActivity { ListView listview; // 先整理資料來源,listitem.xml 需要傳入三種資料 : 圖片 狗狗名字 狗狗生日 // 狗狗圖片 int[] pic =new ListView 自訂排版 主程式 : public class Main3Activity extends AppCompatActivity { ListView listview; // 先整理資料來源,listitem.xml 需要傳入三種資料 : 圖片 狗狗名字 狗狗生日 // 狗狗圖片 int[] pic =new int[]{r.drawable.dog1, R.drawable.dog2,

More information

预览图 : (2) 在 SelectCity.java 中增加控件, 用于绑定 select_city 文件的 ListView, TextView,EditTest 等控件 代码和注释如下 :

预览图 : (2) 在 SelectCity.java 中增加控件, 用于绑定 select_city 文件的 ListView, TextView,EditTest 等控件 代码和注释如下 : EditText 实现城市搜索 1801210778 邹宇航 摘要 : 使用 EditText 实现搜索城市的功能, 以此为依据更新 ListView 1. 效果图 : 2. 主要步骤 (1) 在 select-city.xml 布局文件中中添加 EditText 控件用作搜索框, 然后添加 ListView 控件用来显示城市名字内容 代码如下 : 预览图 : (2) 在 SelectCity.java

More information

Android Service

Android Service Android Service- 播放音樂 建國科技大學資管系 饒瑞佶 2013/7 V1 Android Service Service 是跟 Activity 並行 一個音樂播放程式若沒使用 Service, 即使按 home 鍵畫面離開之後, 音樂還是照播 如果再執行一次程式, 新撥放的音樂會跟先前撥放的一起撥, 最後程式就會出錯 執行中的程式完全看不到! 但是, 寫成 Service 就不同了

More information

01_Service

01_Service 移动平台应用软件开发 Service 主讲 : 张齐勋 zhangqx@ss.pku.edu.cn 移动平台应用软件开发 课程建设小组 北京大学 二零一七年 什么是 Service 与 Activity 一样, 同属 Android 基本组件 后台运行, 不与用户交互, 没有可视化界面 最常见的 Service 如 : 在后台播放歌曲 后台执行文件的下载 同样需在 AndroidManifest.xml

More information

Android Fragment

Android Fragment Android Fragment 建國科技大學資管系饒瑞佶 2017/10 V1 Android 3.0 後才支援 Fragment 解決部分 App 適應螢幕大小的問題 它類似於 Activity, 可以像 Activity 可以擁有自己的版面設計, 也和 Activity 一樣有自己的生命週期 ( 具備 oncreate() oncreateview() 與 onpause() 方法 ) LifeCycle

More information

RecyclerView and CardVew

RecyclerView and CardVew RecyclerView and CardView 建國科技大學資管系饒瑞佶 2017/10 V1 CardView CardView A CardView is a ViewGroup. Like any other ViewGroup, it can be added to youractivity or Fragment using a layout XML file. To create an

More information

图 6-1 主界面 MainActivity 界面对应的布局文件 (activity_main.xml) 如下所示 : <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="

图 6-1 主界面 MainActivity 界面对应的布局文件 (activity_main.xml) 如下所示 : <?xml version=1.0 encoding=utf-8?> <RelativeLayout xmlns:android= 第 6 章广播接收者 应用案例 案例 6-1 CallRecord( 通话记录 ) 一 案例描述 1 考核知识点 030006001: 广播接收者简介 030006002: 广播接收者的创建 2 练习目标 广播的静态注册和使用 使用广播处理处理事件 3 需求分析手机最重要的功能就是通话功能, 同样储存通话记录也是必不可少的 该案例使用广 播接收者自己实现通话记录的功能 包括呼出电话 已接来电 未接来电以及通话产生的

More information

Dynamic Layout in Android

Dynamic Layout in Android Dynamic Layout in Android 建國科技大學資管系 饒瑞佶 2013/5 V1 Layout 多半都透過 res/layout/xml 格式設定來達成 Android 是 OOP, 所以可以動態產生 Layout 重點是 Layout 的階層關係 (Hierarchy) 需要處理對應事件 最後一樣用 setcontentview 加入 Layout 一 加入現有 Layout 中

More information

Android 编程基础 Android 开发教程 & 笔记 1

Android 编程基础 Android 开发教程 & 笔记 1 Android 开发教程 & 笔记 1 多式样 ProgressBar 撰写 : 地狱怒兽 联系 :zyf19870302@126.com 普通圆形 ProgressBar 该类型进度条也就是一个表示运转的过程, 例如发送短信, 连接网络等等, 表示一个过程正 在执行中 一般只要在 XML 布局中定义就可以了

More information

エスポラージュ株式会社 住所 : 東京都江東区大島 東急ドエルアルス大島 HP: ******************* * 关于 Java 测试试题 ******

エスポラージュ株式会社 住所 : 東京都江東区大島 東急ドエルアルス大島 HP:  ******************* * 关于 Java 测试试题 ****** ******************* * 关于 Java 测试试题 ******************* 問 1 运行下面的程序, 选出一个正确的运行结果 public class Sample { public static void main(string[] args) { int[] test = { 1, 2, 3, 4, 5 ; for(int i = 1 ; i System.out.print(test[i]);

More information

第 6 章 BroadcastReceiver( 广播接收者 ) 学习目标 掌握广播接收者的创建, 以及如何自定义广播 ; 掌握有序广播和无序广播的使用, 能够对有序广播进行拦截 在 Android 系统中, 广播是一种运用在应用程序之间传递消息的机制, 例如电池电量低时会发送一条提示广播 要过滤并

第 6 章 BroadcastReceiver( 广播接收者 ) 学习目标 掌握广播接收者的创建, 以及如何自定义广播 ; 掌握有序广播和无序广播的使用, 能够对有序广播进行拦截 在 Android 系统中, 广播是一种运用在应用程序之间传递消息的机制, 例如电池电量低时会发送一条提示广播 要过滤并 第 6 章 BroadcastReceiver( 广播接收者 ) 学习目标 掌握广播接收者的创建, 以及如何自定义广播 ; 掌握有序广播和无序广播的使用, 能够对有序广播进行拦截 在 Android 系统中, 广播是一种运用在应用程序之间传递消息的机制, 例如电池电量低时会发送一条提示广播 要过滤并接收广播中的消息就需要使用 BroadcastReceiver( 广播接收者 ), 广播接收者是 Android

More information

單步除錯 (1/10) 打開 Android Studio, 點選 Start a new Android Studio project 建立專案 Application name 輸入 BMI 點下 Next 2 P a g e

單步除錯 (1/10) 打開 Android Studio, 點選 Start a new Android Studio project 建立專案 Application name 輸入 BMI 點下 Next 2 P a g e Android Studio Debugging 本篇教學除了最基本的中斷點教學之外, 還有條件式中斷的教學 條件式中斷是進階的除錯技巧, 在某些特定情況中, 我們有一個函數可能會被呼叫數次, 但是我們只希望在某種條件成立時才進行中斷, 進而觀察變數的狀態 而條件式中斷這項技巧正是符合這項需求 本教學分兩部分 單步除錯 (Page2~11, 共 10) 條件式中斷點 (Page12~17, 共 6)

More information

Android + NFC

Android + NFC Android + NFC 建國科技大學資管系饒瑞佶 2017/3 v1 讀取 Tag UUID Android 2.3.3 (API Level 10) 才有支援完整的 NFC 功能 只要 NFC 相容都讀的到 (NFC 或 Mifare) 建立新專案修改 AndroidManifest.xml 加入 , 如果有 NFC Tag 進入感測範圍, 本 App 也會變成可處理的

More information

SDK 概要 使用 Maven 的用户可以从 Maven 库中搜索 "odps-sdk" 获取不同版本的 Java SDK: 包名 odps-sdk-core odps-sdk-commons odps-sdk-udf odps-sdk-mapred odps-sdk-graph 描述 ODPS 基

SDK 概要 使用 Maven 的用户可以从 Maven 库中搜索 odps-sdk 获取不同版本的 Java SDK: 包名 odps-sdk-core odps-sdk-commons odps-sdk-udf odps-sdk-mapred odps-sdk-graph 描述 ODPS 基 开放数据处理服务 ODPS SDK SDK 概要 使用 Maven 的用户可以从 Maven 库中搜索 "odps-sdk" 获取不同版本的 Java SDK: 包名 odps-sdk-core odps-sdk-commons odps-sdk-udf odps-sdk-mapred odps-sdk-graph 描述 ODPS 基础功能的主体接口, 搜索关键词 "odpssdk-core" 一些

More information

内文-2.indd

内文-2.indd 客户端服务端音乐资源信息 : 1. 项目需求从本项目开始, 我们一起开发一个简单的在线音乐播放器, 它具有以下功能 (1) 程序启动时显示一个启动画面, 如图 1-1 所示 (2) 在程序主页面显示服务器上的歌曲列表, 包括歌手名与歌曲名, 单击列表条目可实现在线音乐播放, 单击 播放 暂停 上一曲 下一曲 按钮可实现对应的功能, 进度条可以显示歌曲播放进度, 如图 1-2 所示 图 1-1 程序启动画面

More information

任务实施 (1) 创建项目 图 3-1 欢迎界面 首先创建一个工程, 将其命名为 BoXueGu, 指定包名为 com.boxuegu (2) 导入界面图片将欢迎界面所需要的背景图片 launch_bg.png 导入到 drawable 文件夹中, 项目的 icon 图标 app_icon.png

任务实施 (1) 创建项目 图 3-1 欢迎界面 首先创建一个工程, 将其命名为 BoXueGu, 指定包名为 com.boxuegu (2) 导入界面图片将欢迎界面所需要的背景图片 launch_bg.png 导入到 drawable 文件夹中, 项目的 icon 图标 app_icon.png 第 3 章注册与登录模块 学习目标 掌握欢迎界面的开发, 能够独立制作欢迎界面 ; 掌握注册和登录模块的开发, 能够实现用户登录功能 博学谷项目的注册与登录模块主要用于创建用户账号, 管理用户信息 当用户注册成功后会跳转到登录界面, 用户登录后可以修改密码以及设置密保, 且只有设置过密保的账户才可以找回密码 本章将针对注册与登录模块进行详细讲解 3.1 欢迎界面 任务综述 在实际开发中, 开启应用程序时首先会呈现一个欢迎界面,

More information

OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数

OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数 OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数 复习 类的复用 组合 (composition): has-a 关系 class MyType { public int i; public double d; public char c; public void set(double

More information

为什么引入 Intent Android 应 用程序的四 大组件 Activities Services Content Providers Broadcast Receivers 解决 Android 应用的各项组件之间的通讯 Activity Service Intent Broadcast R

为什么引入 Intent Android 应 用程序的四 大组件 Activities Services Content Providers Broadcast Receivers 解决 Android 应用的各项组件之间的通讯 Activity Service Intent Broadcast R 移动平台应用软件开发 Intent( 意图 ) 主讲 : 张齐勋 zhangqx@ss.pku.edu.cn 移动平台应用软件开发 课程建设小组北京大学二零一五年 为什么引入 Intent Android 应 用程序的四 大组件 Activities Services Content Providers Broadcast Receivers 解决 Android 应用的各项组件之间的通讯 Activity

More information

幻灯片 1

幻灯片 1 Delivering accurate maps to Chinese Android users 为中国安卓用户提供准确的地图服务 Work at Mapbox includes: Android apps, demos, starter kits, documentation, support, syncing Android team with other departments, etc.

More information

0511-Android程式之GPS應用_專題週記4

0511-Android程式之GPS應用_專題週記4 逢甲大學通訊工程學系專題研究 Android 程式之 GPS 應用 專題週記 0511 學生姓名 陳彥儒 D0035131 廖元譽 D0077791 指導老師 楊豐瑞老師繳交日期 2014.05.11 1 匯入 GoogleMap 1.1 取得授權步驟 目前進度 取得 Google 授權鑰匙 實作程式尚未成功 1.1.1 建立個人的 keystore 1.1.2 由個人的 keystore 查詢 SHA1

More information

建模与图形思考

建模与图形思考 C03_c 基 於 軟 硬 整 合 觀 點 JNI: 从 C 调 用 Java 函 数 ( c) By 高 煥 堂 3 How-to: 基 於 軟 硬 整 合 觀 點 从 C 调 用 Java 函 数 如 果 控 制 点 摆 在 本 地 C 层, 就 会 常 常 1. 从 本 地 C 函 数 去 调 用 Java 函 数 ; 2. 从 本 地 C 函 数 去 存 取 Java 层 对 象 的 属 性

More information

Microsoft Word 杨超-spinner实现省市县的三级联动.docx

Microsoft Word 杨超-spinner实现省市县的三级联动.docx Spinner 实现省市县的三级联动 1801210908- 杨超 下拉框 Spinner 控件 : 常用属性 属性 说明 android:prompt 下拉提示信息 android:spinnermode 下拉显示方法 android:entries 配置下拉框数据源 android:dropdownwidth 下拉框显示模式下的显示项宽度 常用方法 方法 说明 getdropdownwidth()

More information

OOP with Java 通知 Project 4: 4 月 19 日晚 9 点

OOP with Java 通知 Project 4: 4 月 19 日晚 9 点 OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 Project 4: 4 月 19 日晚 9 点 复习 类的复用 组合 (composition): has-a 关系 class MyType { public int i; public double d; public char c; public void set(double x) { d

More information

掌盟 SoEasy SDK 开发者帮助文档 1. 接入前项目检查 根据游戏接入后出现的问题, 对游戏项目做以下几点要求 : a) AndroidManifest.xml 中 android:targetsdkversion="19" b) 如果 AndroidManifest.xml 有 insta

掌盟 SoEasy SDK 开发者帮助文档 1. 接入前项目检查 根据游戏接入后出现的问题, 对游戏项目做以下几点要求 : a) AndroidManifest.xml 中 android:targetsdkversion=19 b) 如果 AndroidManifest.xml 有 insta 1. 接入前项目检查 根据游戏接入后出现的问题, 对游戏项目做以下几点要求 : a) AndroidManifest.xml 中 android:targetsdkversion="19" b) 如果 AndroidManifest.xml 有 installlocation 选项时, 参数设置为 auto c) AndroidManifest.xml 中的 Activity 需要进行如下配置 android:configchanges="keyboardhidden

More information

用手機直接傳值不透過網頁連接, 來當作搖控器控制家電 ( 電視遙控器 ) 按下按鍵發送同時會回傳值來確定是否有送出 問題 :1. 應該是使用了太多 thread 導致在傳值上有問題 2. 一次按很多次按鈕沒辦法即時反應

用手機直接傳值不透過網頁連接, 來當作搖控器控制家電 ( 電視遙控器 ) 按下按鍵發送同時會回傳值來確定是否有送出 問題 :1. 應該是使用了太多 thread 導致在傳值上有問題 2. 一次按很多次按鈕沒辦法即時反應 專題進度 老師 : 趙啟時老師 學生 : 陳建廷 2013/10/13 用手機直接傳值不透過網頁連接, 來當作搖控器控制家電 ( 電視遙控器 ) 按下按鍵發送同時會回傳值來確定是否有送出 問題 :1. 應該是使用了太多 thread 導致在傳值上有問題 2. 一次按很多次按鈕沒辦法即時反應 程式碼 : package com.example.phone; import java.util.arraylist;

More information

Android 开发教程

Android 开发教程 封面 1 GUI 可视化设计器 DroidDraw DroidDraw 是一个基于 Java Swing 的 Android 界面设计器, 可以通过它来生成复杂的 Android Layout XML 文 件,Android 的 Layout 和 Swing Layout 中有很好的对应, 设计器的代码编写起来比较容易 2 AnDroidDraw AnDroidDraw 是一个与 DroidDraw

More information

Microsoft Word - 第4章 3D相册.doc

Microsoft Word - 第4章 3D相册.doc 第 4 章 3D 相册 学习目标 u 掌握相册界面的开发, 实现相册的立体与倒影效果 在现实生活中, 我们浏览照片时, 不同的相册软件有不同的浏览效果 本章主要实现了一个 3D 效果的相册, 该相册中的图片可以循环滑动展示 4.1 3D 相册 任务综述 相册界面主要是展示一组图片的立体效果, 并显示每个图片的倒影, 左右滑动可以切换不同的图片到 界面的中间位置, 同时在图片下方显示当前图片的标题,

More information

Android Robert C.C. Huang Oscar F.Y. Liu Peter C.L. Hsieh 2011/03/21

Android Robert C.C. Huang Oscar F.Y. Liu Peter C.L. Hsieh 2011/03/21 Android Robert C.C. Huang Oscar F.Y. Liu Peter C.L. Hsieh 2011/03/21 Outlines for Today Future Planning Review System Architecture Dev. Tools & Making the First App Project Structure & File Details Application

More information

詞 彙 表 編 號 詞 彙 描 述 1 預 約 人 資 料 中 文 姓 名 英 文 姓 名 身 份 證 字 號 預 約 人 電 話 性 別 2 付 款 資 料 信 用 卡 別 信 用 卡 號 信 用 卡 有 效 日 期 3 住 房 條 件 入 住 日 期 退 房 日 期 人 數 房 間 數 量 入

詞 彙 表 編 號 詞 彙 描 述 1 預 約 人 資 料 中 文 姓 名 英 文 姓 名 身 份 證 字 號 預 約 人 電 話 性 別 2 付 款 資 料 信 用 卡 別 信 用 卡 號 信 用 卡 有 效 日 期 3 住 房 條 件 入 住 日 期 退 房 日 期 人 數 房 間 數 量 入 100 年 特 種 考 試 地 方 政 府 公 務 人 員 考 試 試 題 等 別 : 三 等 考 試 類 科 : 資 訊 處 理 科 目 : 系 統 分 析 與 設 計 一 請 參 考 下 列 旅 館 管 理 系 統 的 使 用 案 例 圖 (Use Case Diagram) 撰 寫 預 約 房 間 的 使 用 案 例 規 格 書 (Use Case Specification), 繪 出 入

More information

一 登录 crm Mobile 系统 : 输入 ShijiCare 用户名和密码, 登录系统, 如图所示 : 第 2 页共 32 页

一 登录 crm Mobile 系统 : 输入 ShijiCare 用户名和密码, 登录系统, 如图所示 : 第 2 页共 32 页 第 1 页共 32 页 crm Mobile V1.0 for IOS 用户手册 一 登录 crm Mobile 系统 : 输入 ShijiCare 用户名和密码, 登录系统, 如图所示 : 第 2 页共 32 页 二 crm Mobile 界面介绍 : 第 3 页共 32 页 三 新建 (New) 功能使用说明 1 选择产品 第 4 页共 32 页 2 填写问题的简要描述和详细描述 第 5 页共

More information

Android线程和进程

Android线程和进程 Android 进程和线程 版权声明 华清远见教育集团版权所有 ; 未经华清远见明确许可, 不得为任何目的以任何形式复制或传播此文档的任何部分 ; 本文档包含的信息如有更改, 恕不另行通知 ; 华清远见教育集团保留所有权利 Android 进程和线程 在安装 Android 应用程序的时候,Android 会为每个程序分配一个 Linux 用户 ID, 并设置相应的权限, 这样其它应用程序就不能访问此应用程序所拥有的数据和资源了

More information

1 1 大概思路 创建 WebAPI 创建 CrossMainController 并编写 Nuget 安装 microsoft.aspnet.webapi.cors 跨域设置路由 编写 Jquery EasyUI 界面 运行效果 2 创建 WebAPI 创建 WebAPI, 新建 -> 项目 ->

1 1 大概思路 创建 WebAPI 创建 CrossMainController 并编写 Nuget 安装 microsoft.aspnet.webapi.cors 跨域设置路由 编写 Jquery EasyUI 界面 运行效果 2 创建 WebAPI 创建 WebAPI, 新建 -> 项目 -> 目录 1 大概思路... 1 2 创建 WebAPI... 1 3 创建 CrossMainController 并编写... 1 4 Nuget 安装 microsoft.aspnet.webapi.cors... 4 5 跨域设置路由... 4 6 编写 Jquery EasyUI 界面... 5 7 运行效果... 7 8 总结... 7 1 1 大概思路 创建 WebAPI 创建 CrossMainController

More information

移动终端开发与应用

移动终端开发与应用 移动终端开发与应用 第一节 Android 系统的信使 :Intent 2 Intent 概述 Android 系统从诞生之初就不允许直接访问 4 大组件 (Activity Service Broadcast Receiver 和 Content Provider) 而是通过 Intent 对象来跟各种组件进行交互 Intent 对象被应用于 4 大组件中的 3 个 (Activity Service

More information

本章学习目标 小风 Java 实战系列教程 SpringMVC 简介 SpringMVC 的入门案例 SpringMVC 流程分析 配置注解映射器和适配器 注解的使用 使用不同方式的跳转页面 1. SpringMVC 简介 Spring web mvc

本章学习目标 小风 Java 实战系列教程 SpringMVC 简介 SpringMVC 的入门案例 SpringMVC 流程分析 配置注解映射器和适配器 注解的使用 使用不同方式的跳转页面 1. SpringMVC 简介 Spring web mvc 本章学习目标 SpringMVC 简介 SpringMVC 的入门案例 SpringMVC 流程分析 配置注解映射器和适配器 配置视图解析器 @RequestMapping 注解的使用 使用不同方式的跳转页面 1. SpringMVC 简介 Spring web mvc 和 Struts2 都属于表现层的框架, 它是 Spring 框架的一部分, 我们可 以从 Spring 的整体结构中看得出来 :

More information

Microsoft Word - 第3章.doc

Microsoft Word - 第3章.doc 第 章.1 Android UI 基本概念 用户界面 (User Interface,UI) 是用户与设备之间进行信息交流的直接媒介, 是决定用户体验最重要的部分 相比于早期的计算机的主要交互界面 批处理界面和命令行界面, 现在更为流行的是更简单直接的用户图形界面 (Graphical User Interface, GUI) GUI 简单易用, 受众面广, 直接推动了个人计算机的发展 目前, 主流大众的操作系统都采用了

More information

软件工程文档编制

软件工程文档编制 实训抽象类 一 实训目标 掌握抽象类的定义 使用 掌握运行时多态 二 知识点 抽象类的语法格式如下 : public abstract class ClassName abstract void 方法名称 ( 参数 ); // 非抽象方法的实现代码 在使用抽象类时需要注意如下几点 : 1 抽象类不能被实例化, 实例化的工作应该交由它的子类来完成 2 抽象方法必须由子类来进行重写 3 只要包含一个抽象方法的抽象类,

More information

ShareText

ShareText 作者 : 林致宇 日期 :2012/1/23 問題 : 如何分享分享文字資訊給其它的應用程式? 解答 : 有時候我們可能會希望 我們的應用程式的資訊 能夠讓使用者分享出去, 讓使用者能夠將此資訊傳送簡訊給其好友或寄電子郵件的方式寄給其好友, 這份文件將示範如何寫出這樣的應用程式 本文件將產出兩個 App, 第一個 App 是 分享資料的來源, 名為 CopyPaste_Source, 功能非常簡單,

More information

第一章 Android 简介与开发环境搭建

第一章 Android 简介与开发环境搭建 安卓开发环境与常用布局 第一章 Android 简介与开发环境搭建 本章目标 3G 的概念 Android 的改变 Android 开发环境的搭建编写第一个 Android 程序 Android 程序的目录结构 手机发展史 1. 3G 的概念 3G 全称为 :3rd Generation, 中文含义即为第三代数字通信, 是指将无线通信与国际互联网等多媒体通信结合的新一代移动通信系统 2. 符合 3G

More information

Guava学习之Resources

Guava学习之Resources Resources 提供提供操作 classpath 路径下所有资源的方法 除非另有说明, 否则类中所有方法的参数都不能为 null 虽然有些方法的参数是 URL 类型的, 但是这些方法实现通常不是以 HTTP 完成的 ; 同时这些资源也非 classpath 路径下的 下面两个函数都是根据资源的名称得到其绝对路径, 从函数里面可以看出,Resources 类中的 getresource 函数都是基于

More information

Microsoft Word - 第4章 Android生命周期.docx

Microsoft Word - 第4章 Android生命周期.docx Android 应用程序开发与典型案例 作者 : 华清远见 第 4 章 Android 生命周期 本章简介 经过上一章的学习, 主要了解了 Android 应用程序设计的基础知识, 对 Android 程序的开发有了一定的了解 在此基础上, 本章将对 Android 系统的进程优先级的 变化方式 Android 系统的 4 大基本组件 Activity 的生命周期中各个状态的变化关 系 Android

More information

小应用 Magic8

小应用 Magic8 胡家威 计研135班 http://hujiaweibujidao.github.io/ 小应用 Magic8 Android 系统简介 Android 应用结构 Android 四大组件 Activity 生命周期 Android 资源管理 UI 组件和容器组件 内容概要 ( 上 ) Android 系统简介 Android 市场份额 Android 是如何诞生的? Android 之父 :Andy

More information

DU Ad Platform_SDK 安卓接入指南 DU Ad Platform_SDK for Android 接入手册 ( 触发式广告 ) DUAd_SDK_Trigger v1.0 百度在线网络技术 ( 北京 ) 有限公司 百度在线网络技术 ( 北京 ) 有限公司 - 1 -

DU Ad Platform_SDK 安卓接入指南 DU Ad Platform_SDK for Android 接入手册 ( 触发式广告 ) DUAd_SDK_Trigger v1.0 百度在线网络技术 ( 北京 ) 有限公司 百度在线网络技术 ( 北京 ) 有限公司 - 1 - DU Ad Platform_SDK for Android 接入手册 ( 触发式广告 ) DUAd_SDK_Trigger v1.0-1 - 目录 1. 获取身份... 1 2. 加载与配置... 2 2.1 加载 SDK 文件... 2 2.2 配置 AndroidManifest.xml... 2 2.3 混淆代码... 3 3. 初始化... 4 4. 功能使用... 4 第 1 页共 1

More information

建模与图形思考

建模与图形思考 F06_c 观摩 :ContentProvider 基於軟硬整合觀點 架构與 DB 引擎移植方法 ( c) By 高煥堂 4 通用性基类 ContentProvider 基於軟硬整合觀點 的使用范例 刚才的范例里, 我们直接使用 DataPersist 类的接口来与 SQLite 沟通 本节将替 DataPersist 配上 ContentProvider 基类, 让 Client 能透过 ContentProvider

More information

Microsoft Word - 第3章.doc

Microsoft Word - 第3章.doc 第 3 章 多个用户界面的程序设计 3.1 页面的切换与传递参数值 3.1.1 传递参数组件 Intent Intent 是 Android 系统的一种运行时的绑定机制, 在应用程序运行时连接两个不同组件 在 Android 的应用程序中不管是页面切换还是传递数据或是调用外部程序都可能要用到 Intent Intent 负责对应用中某次操作的动作 动作涉及的数据 附加数据进行描述, Android

More information

教案模板4-2

教案模板4-2 移动终端开发技术 电子教案 第三单元 ListView 的功能和用法 章节名称 : 第二章 软件要美观 UI 开发的点点滴滴 所属专业 ( 教研室 ): 计算机软件技术 制定人 : 陈媛媛 合作人 : 制定时间 : 2018 年 2 月 日照职业技术学院 单元标题 ListView 的功能和用法 单元教学学时 在整体设计中的位置 4 课时 第 7 次 授课班级上课地点一体化教室 上课时间周月日第节

More information

C++ 程序设计 告别 OJ1 - 参考答案 MASTER 2019 年 5 月 3 日 1

C++ 程序设计 告别 OJ1 - 参考答案 MASTER 2019 年 5 月 3 日 1 C++ 程序设计 告别 OJ1 - 参考答案 MASTER 2019 年 月 3 日 1 1 INPUTOUTPUT 1 InputOutput 题目描述 用 cin 输入你的姓名 ( 没有空格 ) 和年龄 ( 整数 ), 并用 cout 输出 输入输出符合以下范例 输入 master 999 输出 I am master, 999 years old. 注意 "," 后面有一个空格,"." 结束,

More information

新・解きながら学ぶJava

新・解きながら学ぶJava 481! 41, 74!= 40, 270 " 4 % 23, 25 %% 121 %c 425 %d 121 %o 121 %x 121 & 199 && 48 ' 81, 425 ( ) 14, 17 ( ) 128 ( ) 183 * 23 */ 3, 390 ++ 79 ++ 80 += 93 + 22 + 23 + 279 + 14 + 124 + 7, 148, 16 -- 79 --

More information

获取 Access Token access_token 是接口的全局唯一票据, 接入方调用各接口时都需使用 access_token 开发者需要进行妥善保存 access_token 的存储至少要保留 512 个字符空间 access_token 的有效期目前为 2 个小时, 需定时刷新, 重复

获取 Access Token access_token 是接口的全局唯一票据, 接入方调用各接口时都需使用 access_token 开发者需要进行妥善保存 access_token 的存储至少要保留 512 个字符空间 access_token 的有效期目前为 2 个小时, 需定时刷新, 重复 获取 Access Token access_token 是接口的全局唯一票据, 接入方调用各接口时都需使用 access_token 开发者需要进行妥善保存 access_token 的存储至少要保留 512 个字符空间 access_token 的有效期目前为 2 个小时, 需定时刷新, 重复 获取将导致上次获取的 access_token 失效 接入方可以使用 AppID 和 AppSecret

More information

2 从列表选择在添加黑名单界面中, 点击 从联系人中添加 按钮时, 会跳转到联系人列表界面, 点击其中的任意一个联系人, 此时该联系人的电话号码和姓名会显示在添加黑名单界面的编辑框中, 点击下方的 添加 按钮, 此时会将该号码添加到黑名单中, 并在主界面中展示, 如图 3-2 所示 图 3-2 从联

2 从列表选择在添加黑名单界面中, 点击 从联系人中添加 按钮时, 会跳转到联系人列表界面, 点击其中的任意一个联系人, 此时该联系人的电话号码和姓名会显示在添加黑名单界面的编辑框中, 点击下方的 添加 按钮, 此时会将该号码添加到黑名单中, 并在主界面中展示, 如图 3-2 所示 图 3-2 从联 第 3 章通讯卫士模块 了解通讯卫士模块功能 掌握 SQLite 数据库的使用 掌握如何使用广播接收者拦截电话和短信在日常生活中, 使用手机时经常会被某些电话或短信骚扰, 例如推销保险 中奖信息等, 为此, 我们开发了通讯卫士模块, 该模块可以将骚扰电话或垃圾短信添加到黑名单中, 并对其进行拦截 本章将针对通讯卫士模块进行详细讲解 3.1 模块概述 3.1.1 功能介绍 通讯卫士模块的主要功能是进行黑名单拦截,

More information

Microsoft Word - weather12 刷新按钮动画+搜索框+bug处理.docx

Microsoft Word - weather12 刷新按钮动画+搜索框+bug处理.docx 一 刷新按钮的动画效果 : 在刷新按钮的位置做两个按钮的布局, 一个是原来的静态图片, 一个是旋转的动画, 然 后控制这两个效果的显示和隐藏 ( 一 ) 刷新按钮的 style: 1. 在 app/src/main/res/values/ styles.xml 文件里添加一个 style: 2. 在 drawable 文件夹下新建一个 title_update_anim.xml, 添加如下内容 注

More information

建立Android新專案

建立Android新專案 Android 智 慧 型 手 機 程 式 設 計 Android WebService 建 國 科 技 大 學 資 管 系 饒 瑞 佶 2012/4 V1 2012/8 V2 2013/5 V3 2014/10 v4 提 醒 這 節 的 內 容 針 對 的 是 MS 的 Web Service 或 是 使 用 SOAP(Simple Object Access Protocol) 標 準 建 立

More information

PowerPoint 演示文稿

PowerPoint 演示文稿 The BitCoin Scripting Language 交易实例 交易结构 "result": { "txid": "921a dd24", "hash": "921a dd24", "version": 1, "size": 226, "locktime": 0, "vin": [ ], "vout": [ ], "blockhash": "0000000000000000002c510d

More information

腾讯社交广告转化追踪 Android SDK 接入说明文档 V1.2

腾讯社交广告转化追踪 Android SDK 接入说明文档 V1.2 腾讯社交广告转化追踪 Android SDK 接入说明文档 V1.2 文档 腾讯社交广告转化追踪 Android SDK 接入说明文档 V1.2 必读 1. SDK 嵌入 1.1 步骤 1: 添加 SDK 到工程中 1.2 步骤 2: 修改 AndroidManifest.xml 文件 2. 接入代码 2.1 激活事件统计接口 2.1.1 接入代码示例 2.1.2 激活事件主要 API 2.2 更多转化类型统计接口

More information

_banneradview.settest(true); _banneradview.setuserkeywords("swimming"); _banneradview.setusercategories("1,3,4"); _banneradview.setusergender(jdbanner

_banneradview.settest(true); _banneradview.setuserkeywords(swimming); _banneradview.setusercategories(1,3,4); _banneradview.setusergender(jdbanner 京东 APP 联盟 SDK Android 版接口说明文档 1.0 1. 嵌入 SDK 1.1 添加 SDK Android Studio 环境 : 菜单 New->New Module->Import.jar or.aar package, 然后选中 App 联盟 SDK 所带的 jar 文件 Eclipse+ADT 环境 : 将 App 联盟 SDK 所带的 jar 文件拷贝到 libs/ 目录下

More information

untitled

untitled JavaEE+Android - 6 1.5-2 JavaEE web MIS OA ERP BOSS Android Android Google Map office HTML CSS,java Android + SQL Sever JavaWeb JavaScript/AJAX jquery Java Oracle SSH SSH EJB+JBOSS Android + 1. 2. IDE

More information

移动终端开发与应用

移动终端开发与应用 移动终端开发与应用 课程目标 LayoutInflater 原理分析 Fragment 简要 创建 Fragment FragmentManager 和 FragmentTransaction 类 Fragment 的生命周期 Activity 与 Fragment 之间的交互 Fragment 的状态的持久化 Fragment 与回退栈 Fragment 扩展 2 第一节 LayoutInflater

More information

OOP with Java 通知 Project 4: 5 月 2 日晚 9 点

OOP with Java 通知 Project 4: 5 月 2 日晚 9 点 OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 Project 4: 5 月 2 日晚 9 点 复习 类的复用 组合 (composition): has-a 关系 class MyType { public int i; public double d; public char c; public void set(double x) { d =

More information

TVS厂商接入流程API文档

TVS厂商接入流程API文档 TVS 登录接 入 一. 登录验证流程 1. 厂商 APP-LWA-AVS 音箱 -AVS 验证流程 2. 厂商 APP- 微信开发平台 -TVS 后台 -TVS 音箱 -TVS 验证流程 3 厂商 APP-QQ 互联平台 -TVS 后台 -TVS 音箱 -TVS 验证流程 二 厂商 APP 接 入 TVS 登录系统配置步骤 1. 打开 工程 app 目录下的 build.gradle, (1) 确保

More information

Struts2自定义类型转换.doc

Struts2自定义类型转换.doc Struts2 自定义类型转换 原理 struts2 的自定义类型转换机制为复杂类型的输入输出处理提供了便捷.struts2 已经为我们提供了几乎所有的 primitive 类型以及常用类型 ( 如 Date) 的类型转换器, 我们也可以为我们自定义类添加自定义类型转化器. struts2 为我们提供了一个类型转化器的入口 : ognl.defaulttypeconverter, 或继承 org.apache.struts2.util.strutstypeconverter,

More information

题目

题目 开发 Android 应用 目的 : 帮助大家了解 Android 平台开发 作者 : 王威威 技术爱好 : linux,qt, 嵌入式开发 MSN : wangweiweicdma@hotmail.com Email : wang.weiwei1@ztenc.com.cn wangjiecdma@126.com 下载开发资源 1 下载最新的 Android SDK http://code.google.com/android/download.html

More information

Android 开发教程

Android 开发教程 封面 1 文件存取编程基础 文件 文件可以用来存储比使用引用更大数量的数据 Android 提供方法来读 写文件 只有本地文件可以被访问 优点 : 可以存储大容量的数据 缺点 : 文件更新或是格式改变可能会导致巨大的编程工作 文件操作 读文件 Context.openFileInput(String name) 打开一个与应用程序联系的私有文件输入流 当文件不存在时抛出 FileNotFoundException

More information

<4D F736F F D20B5DA36D5C220D7E9BCFEBCE4CDA8D0C52E646F6378>

<4D F736F F D20B5DA36D5C220D7E9BCFEBCE4CDA8D0C52E646F6378> Android 应用程序开发与典型案例 作者 : 华清远见 第 6 章组件间通信 本章简介 在第 5 章的学习中, 主要了解了 Android 程序界面的开发, 包括用户界面基础 用户界面控件的使用 界面布局的特点及使用方法 菜单的使用方法 界面事件的 处理方法等 在此基础上, 本章将对 Android 组件间的通信进行学习, 包括 Intent 进行组件通信的原理 Intent 启动 Activity

More information

无类继承.key

无类继承.key 无类继承 JavaScript 面向对象的根基 周爱 民 / aimingoo aiming@gmail.com https://aimingoo.github.io https://github.com/aimingoo rand = new Person("Rand McKinnon",... https://docs.oracle.com/cd/e19957-01/816-6408-10/object.htm#1193255

More information

Microsoft PowerPoint - 05.Android 介面元件-RelativeLayout、Button、TextVeiw、EditText

Microsoft PowerPoint - 05.Android 介面元件-RelativeLayout、Button、TextVeiw、EditText 計劃名稱 : 104 年度教育部資通訊軟體創新人才推升推廣計畫跨校資源中心 : 雲端運算 ( 國立中山大學 ) 課程名稱 : 網路及平台服務 Part1- 課程教材 教材名稱 :Android 介面元件 -RelativeLayout Button TextVeiw EditText 國立高雄大學資訊工程學系張保榮教授 大綱 RelativeLayout 版面配置 Button 版面配置 TextView

More information

单击以编辑母片 Content 标题样式 LinearLayout 排版模式 TableLayout 排版模式 RelativeLayout 排版模式 AbsoluteLayout 排版模式 FrameLayout 排版模式 GridLayout 排版模式 TabWidget 切換卡 Lab 5 2

单击以编辑母片 Content 标题样式 LinearLayout 排版模式 TableLayout 排版模式 RelativeLayout 排版模式 AbsoluteLayout 排版模式 FrameLayout 排版模式 GridLayout 排版模式 TabWidget 切換卡 Lab 5 2 单击以编辑母片标题样式 安卓系统 Android 的排版 授课老师 : 谢兆贤 2016/4/18 1 单击以编辑母片 Content 标题样式 LinearLayout 排版模式 TableLayout 排版模式 RelativeLayout 排版模式 AbsoluteLayout 排版模式 FrameLayout 排版模式 GridLayout 排版模式 TabWidget 切換卡 Lab 5

More information

LEFT, RIGHT // 左 // 右 (2) 当图片移动后, 按钮的坐标发生改变, 此操作通过 setloca tion() 方法实现 setlocation() 方法是从 Component 类继承的, 其定义如下 : public void setlocation(int x, int y

LEFT, RIGHT // 左 // 右 (2) 当图片移动后, 按钮的坐标发生改变, 此操作通过 setloca tion() 方法实现 setlocation() 方法是从 Component 类继承的, 其定义如下 : public void setlocation(int x, int y 拼图游戏 任务说明 本实例实现了拼图游戏的开发 运行程序, 单击 开始 按钮将打乱图片的位置, 效果如图 1 所示, 然后通过鼠标单击图片进行移动, 直到将所有图片都移动到正确位置, 游戏过关, 过关后的效果如图 2 所示 图 1 打乱图片位置的效果图 2 图片移动到正确位置的效果 关键技术 本程序主要通过 Swing 与枚举类实现, 程序将一幅完整的图片平均分成 9 部分, 每一部分为一个正方形,

More information

移动平台期末展示

移动平台期末展示 移动平台开发作品展示 周芳张文杰谢殊凡 作品简介 一 作品简介 Ø 应用名称 : 一笔画 Ø 功能 : 随机生成一笔画图案 玩家可以在屏幕上描绘图案, 程序会判定绘制成功或者失败 Ø 设计目的 : 制作一个休闲益智类的小游戏 设计思路 二 设计思路 Ø 1. 自动生成随机的一笔画 奇顶点 : 指数为奇数的顶点 偶顶点 : 指数为偶数的顶点 一笔画图形的必要条件是 : 奇顶点数目是 0 或者 2 Ø

More information

Microsoft Word - 新1-12.doc

Microsoft Word - 新1-12.doc 实训 5 面向对象编程练习 实训 5 面向对象编程练习 5.1 实训目的 通过编程和上机实验理解 Java 语言是如何体现面向对象编程基本思想 以及如何创建类 和对象 了解成员变量和成员方法的特性 5.2 实训要求 编写一个体现面向对象思想的程序 编写一个创建对象和使用对象的方法的程序 5.3 实训内容 5.3.1 创建对象并使用对象 1 定义一个 Person 类 可以在应用程序中使用该类 成员属性

More information

前言 C# C# C# C C# C# C# C# C# microservices C# More Effective C# More Effective C# C# C# C# Effective C# 50 C# C# 7 Effective vii

前言 C# C# C# C C# C# C# C# C# microservices C# More Effective C# More Effective C# C# C# C# Effective C# 50 C# C# 7 Effective vii 前言 C# C# C# C C# C# C# C# C# microservices C# More Effective C# More Effective C# C# C# C# Effective C# 50 C# C# 7 Effective vii C# 7 More Effective C# C# C# C# C# C# Common Language Runtime CLR just-in-time

More information

Android + WebService

Android + WebService Android + Web Service 建國科技大學資管系饒瑞佶 2017/3 V1 呼叫 OpenData Web Service http://data.taipei/opendata/datalist/apiaccess?scope=resourceaquire& rid=e7c46724-3517-4ce5-844f-5a4404897b7d http://data.taipei/opendata/datalist/apiaccess?scope=resourceaquir

More information

Microsoft Word - 01.DOC

Microsoft Word - 01.DOC 第 1 章 JavaScript 简 介 JavaScript 是 NetScape 公 司 为 Navigator 浏 览 器 开 发 的, 是 写 在 HTML 文 件 中 的 一 种 脚 本 语 言, 能 实 现 网 页 内 容 的 交 互 显 示 当 用 户 在 客 户 端 显 示 该 网 页 时, 浏 览 器 就 会 执 行 JavaScript 程 序, 用 户 通 过 交 互 式 的

More information

手说TTS开发指南

手说TTS开发指南 手说 TTS 开发指南 v1.3 2011 年 6 月 版权所有 : 手说工作室 shoushuo.com 版本时间作者说明 1.0 2010-11-15 张波 1.1 2010-12-27 在 ondestroy 方法 unbindservice 1.2 2010-12-30 1.3 2011-6-12 去掉 TTS 初始化 ; ttsservice.initialize() 方法调用添加接口方法

More information

OOP with Java 通知 Project 3: 3 月 29 日晚 9 点 4 月 1 日上课

OOP with Java 通知 Project 3: 3 月 29 日晚 9 点 4 月 1 日上课 OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 Project 3: 3 月 29 日晚 9 点 4 月 1 日上课 复习 Java 包 创建包 : package 语句, 包结构与目录结构一致 使用包 : import restaurant/ - people/ - Cook.class - Waiter.class - tools/ - Fork.class

More information

// HDevelopTemplateWPF projects located under %HALCONEXAMPLES%\c# using System; using HalconDotNet; public partial class HDevelopExport public HTuple

// HDevelopTemplateWPF projects located under %HALCONEXAMPLES%\c# using System; using HalconDotNet; public partial class HDevelopExport public HTuple halcon 与 C# 混合编程之 Halcon 代码调用 写在前面 完成 halcon 与 C# 混合编程的环境配置后, 进行界面布局设计构思每一个按钮所需要实现 的功能, 将 Halcon 导出的代码复制至相应的 C# 模块下即可 halcon 源程序 : dev_open_window(0, 0, 512, 512, 'black', WindowHandle) read_image (Image,

More information

Microsoft Word - 第3章.doc

Microsoft Word - 第3章.doc 第 3 章 Android 控件进阶 要设计出让用户喜欢的 Android 应用程序界面, 除了需要用到在第 2 章讲的最基本的 TextView EditText 和 Button 控件外, 还要用到其他控件, 如 ImageButton 控件 ImageView 控件 RadioButton 控件 CheckBox 控件和 ListView 控件等 本章主要讲解功能强大 应用广泛的一些控件 3.1

More information

untitled

untitled 1 Outline 數 料 數 數 列 亂數 練 數 數 數 來 數 數 來 數 料 利 料 來 數 A-Z a-z _ () 不 數 0-9 數 不 數 SCHOOL School school 數 讀 school_name schoolname 易 不 C# my name 7_eleven B&Q new C# (1) public protected private params override

More information

<4D6963726F736F667420506F776572506F696E74202D20332D322E432B2BC3E6CFF2B6D4CFF3B3CCD0F2C9E8BCC6A1AAD6D8D4D8A1A2BCCCB3D0A1A2B6E0CCACBACDBEDBBACF2E707074>

<4D6963726F736F667420506F776572506F696E74202D20332D322E432B2BC3E6CFF2B6D4CFF3B3CCD0F2C9E8BCC6A1AAD6D8D4D8A1A2BCCCB3D0A1A2B6E0CCACBACDBEDBBACF2E707074> 程 序 设 计 实 习 INFO130048 3-2.C++ 面 向 对 象 程 序 设 计 重 载 继 承 多 态 和 聚 合 复 旦 大 学 计 算 机 科 学 与 工 程 系 彭 鑫 pengxin@fudan.edu.cn 内 容 摘 要 方 法 重 载 类 的 继 承 对 象 引 用 和 拷 贝 构 造 函 数 虚 函 数 和 多 态 性 类 的 聚 集 复 旦 大 学 计 算 机 科 学

More information

F515_CS_Book.book

F515_CS_Book.book /USB , ( ) / L R 1 > > > 2, / 3 L 1 > > > 2 + - 3, 4 L 1 了解显示屏上显示的图标 Wap 信箱收到一条 Wap push 信息 ( ) GSM 手机已连接到 GSM 网络 指示条越多, 接收质量越好 2 ...........................4.............................. 4 Micro SD (

More information

Microsoft Word - QTP测试Flex.doc

Microsoft Word - QTP测试Flex.doc TIB 自动化测试工作室 http://www.cnblogs.com/testware 使用 QTP 进行 Flex 自动化测试 自动化测试工具与 Flex 应用程序之间是通过代理 (Agent) 来交互的, 如图所示 : 这也就是为什么后面在使用 QTP 进行 Flex 自动化测试之前要先安装 Flex 插件 配置和编译 Flex 程序的原因 前提条件 在使用 QTP 进行 Flex 4 的测试之前,

More information

第 2 節 介面佈局檔 第 1 項 說明 第 2 項 原始碼 第 3 節 主程式開發 第 1 項 主程式 - 基本設定 第 2 項 主程式 - 產生亂數 第 3 項 主程式 - 數字靠邊 數字加總 第 4 節 加入手

第 2 節 介面佈局檔 第 1 項 說明 第 2 項 原始碼 第 3 節 主程式開發 第 1 項 主程式 - 基本設定 第 2 項 主程式 - 產生亂數 第 3 項 主程式 - 數字靠邊 數字加總 第 4 節 加入手 Android 講義 2016.07.03 目錄 第 1 章 資料存取... 1 第 1 節 使用 SharedPreferences... 1 第 1 項 介面佈局檔... 1 第 2 項 建立主程式的內容 - 儲存偏好設定... 1 第 3 項 驗證儲存偏好的動作... 3 第 4 項 建立主程式的內容 - 提取偏好設定... 3 第 2 節 簡單使用 SQLite... 5 第 1 項 介面佈局檔...

More information

03 开发入门.key

03 开发入门.key #3 手机应用开发入门 刘宁 Email:liuning2@mail.sysu.edu.cn 大纲» Android 基本概念» 开发包及 工具安装» 创建 HelloWorld» Android 程序设计基础 2 Android 开发基本概念» Activities» Intents» 视图与控件 ( 界 面元素 )» 异步调 用 ( 多线程 支持 )» 后台服务 3 Activities Android

More information

Microsoft Word - Android 7.x.doc

Microsoft Word - Android 7.x.doc 第 4 章 Android GUI 开发 Android 系统提供了丰富的可视化界面组件, 包括菜单 按钮 对话框等 Android 系统采用 Java 程序设计中的 UI 设计思想, 其中包括事件处理机制及布局管理方式 Android 系统中的所有 UI 类都是建立在 View 和 ViewGroup 两个类的基础之上的, 所有 View 的子类称为 Widget, 所有 ViewGroup 的子类称为

More information

Microsoft Word - 1 扉页

Microsoft Word - 1 扉页 普通高等教育应用型规划教材 计算机类 Android 程序开发入门教程 俞成海宋瑾钰 舒挺郭家军 编著 北京 内容简介 本书共分 9 章 第 1 章讲述 Android 起源 概述 环境搭建及 Android Studio 的一些使用技巧 ; 第 2 章讲述 Android 程序的基本构成 生命周期及程序中的几大常用布局 ; 第 3 章介绍 Android 中的基础通用控件, 包括常用的文本控件 编辑控件

More information

拉卡拉云POS终端收单支付应用组件调用接口说明

拉卡拉云POS终端收单支付应用组件调用接口说明 拉 卡 拉 互 联 网 POS+ 项 目 收 单 应 用 调 用 接 口 说 明 拉 卡 拉 商 服 公 司 二 一 五 年 八 月 1 文 档 级 别 项 目 组 产 品 部 测 试 部 编 写 者 项 目 组 版 本 1.08 创 建 日 期 2015-08-10 最 后 修 改 日 期 2016-01-22 文 档 修 改 记 录 版 本 修 改 日 期 修 改 人 说 明 1.00 2015-08-10

More information

使用Cassandra和Spark 2.0实现Rest API服务

使用Cassandra和Spark 2.0实现Rest API服务 使用 Cassandra 和 Spark 2.0 实现 Rest API 服务 在这篇文章中, 我将介绍如何在 Spark 中使用 Akkahttp 并结合 Cassandra 实现 REST 服务, 在这个系统中 Cassandra 用于数据的存储 我们已经见识到 Spark 的威力, 如果和 Cassandra 正确地结合可以实现更强大的系统 我们先创建一个 build.sbt 文件, 内容如下

More information

Microsoft Word - Hibernate与Struts2和Spring组合指导.doc

Microsoft Word - Hibernate与Struts2和Spring组合指导.doc 1.1 组合 Hibernate 与 Spring 1. 在 Eclipse 中, 新建一个 Web project 2. 给该项目增加 Hibernate 开发能力, 增加 Hibernate 相关类库到当前项目的 Build Path, 同时也提供了 hibernate.cfg.xml 这个配置文件 3. 给该项目增加 Spring 开发能力, 增加 spring 相关类库到当前项目的 Build

More information

Android Android Android SDK iv

Android Android Android SDK iv Android Market Google Android SDK Apple Google Microsoft b2c b 2010 Internet Android how why iii Android 240... Android Android SDK iv Android Market Google Android SDK Visual C++ Java N-tier J2EE Unix/Linux

More information

教育部補助資訊軟體人才培育先導計畫 100 年度課程發展專案計畫 實驗課程名稱 : IPC(Inter-Process Communication) 開發教師 : 張晉源老師 開發學生 : 林政揚 學校系所 : 樹德科技大學資訊工程學系

教育部補助資訊軟體人才培育先導計畫 100 年度課程發展專案計畫 實驗課程名稱 : IPC(Inter-Process Communication) 開發教師 : 張晉源老師 開發學生 : 林政揚 學校系所 : 樹德科技大學資訊工程學系 教育部補助資訊軟體人才培育先導計畫 100 年度課程發展專案計畫 實驗課程名稱 : IPC(Inter-Process Communication) 開發教師 : 張晉源老師 開發學生 : 林政揚 (s11639104@stu.edu.tw) 學校系所 : 樹德科技大學資訊工程學系 實驗目的 本實驗的目的在於讓同學們可以了解 Android 系統核心內部的行程通訊的原理, 透過呼叫系統提供的其中一樣服務

More information

帝国CMS下在PHP文件中调用数据库类执行SQL语句实例

帝国CMS下在PHP文件中调用数据库类执行SQL语句实例 帝国 CMS 下在 PHP 文件中调用数据库类执行 SQL 语句实例 这篇文章主要介绍了帝国 CMS 下在 PHP 文件中调用数据库类执行 SQL 语句实例, 本文还详细介绍了帝国 CMS 数据库类中的一些常用方法, 需要的朋友可以参考下 例 1: 连接 MYSQL 数据库例子 (a.php)

More information

在Spring中使用Kafka:Producer篇

在Spring中使用Kafka:Producer篇 在某些情况下, 我们可能会在 Spring 中将一些 WEB 上的信息发送到 Kafka 中, 这时候我们就需要在 Spring 中编写 Producer 相关的代码了 ; 不过高兴的是,Spring 本身提供了操作 Kafka 的相关类库, 我们可以直接通过 xml 文件配置然后直接在后端的代码中使用 Kafka, 非常地方便 本文将介绍如果在 Spring 中将消息发送到 Kafka 在这之前,

More information

Chapter 10

Chapter 10 Chapter 10 多媒體程式開發 Widget Widget 簡介 android.widget 套件包含了許多視覺性的 UI 元素, 可用來將操作界面展示在應用程式畫面上 要熟悉 Android 多媒體程式的開發, 必須從 widget 套件著手, 因此本章所舉的範例, 便是以 android.widget 套件的應用為中心 Gallery 簡介 Gallery 是一個水平的清單, 移動清單時,

More information

EJB-Programming-3.PDF

EJB-Programming-3.PDF :, JBuilder EJB 2.x CMP EJB Relationships JBuilder EJB Test Client EJB EJB Seminar CMP Entity Beans Value Object Design Pattern J2EE Design Patterns Value Object Value Object Factory J2EE EJB Test Client

More information

Microsoft Word - 扉页.doc

Microsoft Word - 扉页.doc 第 3 章 Andro 常用基本控件 我们在进行界面布局时, 添加的按钮 文本框 编辑框和图片等, 都是 Andro 的基本控件 这些控件实现了程序的一些基本功能 本章将针对这类控件进行详细的介绍, 使读者掌握基本控件的使用, 开发出简单的 Andro 程序 3.1 文本控件概述 Andro 系统提供给用户已经封装好的界面控件称为系统控件 系统控件更有利于帮助用户进行快速开发, 同时能够使 Andro

More information

拦截器(Interceptor)的学习

拦截器(Interceptor)的学习 二 拦截器 (Interceptor) 的学习 拦截器可以监听程序的一个或所有方法 拦截器对方法调用流提供了细粒度控制 可以在无状态会话 bean 有状态会话 bean 和消息驱动 bean 上使用它们 拦截器可以是同一 bean 类中的方法或是一个外部类 下面介绍如何在 Session Bean 类中使用外部拦截器类 @Interceptors 注释指定一个或多个在外部类中定义的拦截器 下面拦截器

More information

XXX说明书

XXX说明书 实验 1 Android SDK 开发环境的安装及配置 1.1 实验目的 掌握 Java SDK 和 Android SDK 开发环境的安装和配置 1.2 实验内容 Java SDK 的安装和环境变量的配置 Eclipse 的安装和配置 Android SDK 的安装和环境变量的配置 Eclipse 插件 ADT 的安装和配置 Android 模拟器的配置 1.3 实验步骤 1.Java SDK 的安装和环境变量的配置

More information

ChinaBI企业会员服务- BI企业

ChinaBI企业会员服务- BI企业 商业智能 (BI) 开源工具 Pentaho BisDemo 介绍及操作说明 联系人 : 杜号权苏州百咨信息技术有限公司电话 : 0512-62861389 手机 :18616571230 QQ:37971343 E-mail:du.haoquan@bizintelsolutions.com 权限控制管理 : 权限控制管理包括 : 浏览权限和数据权限 ( 权限部分两个角色 :ceo,usa; 两个用户

More information