4个android 思维导图开发汇总,内容涵盖1-开发环境配置、2-开发工具介绍、3-常用调试程序的方法、6-菜单、10-存储策略等11个要点,每张思维导图都非常清晰,每张图片均精选版。
第1张,android 开发思维导图附打印高清版
第2张,android 开发思维导图高清版
第3张,android 开发思维导图高清版
第4张,android 开发思维导图附打印高清版
思维导图知识点说明:
- www.fkjava.org讲师李韩飞 Q1783322568overfly09@gmail.comwww.overfly09.com红色部分需要重点掌握本班课程使用的是Android 4.*版本的应用程序层、应用程序框架层、系统运行库层、Linux内核层:
- 1-开发环境配置:
- 1-安装方式:无论什么方式安装最好都设置环境变量 安装好后就可以获取SDK 了
- 2-创建android项目:     
- 3-运行android项目:1-创建模拟器
- 2-开发工具介绍:
- 3-内存监控:aa
- 3-常用调试程序的方法:使用Eclipse开发平台调试; debug 结合Android SDK调试; Log 使用JUnit调试; Junit
- Log日志:结合Android SDK调试; Log Log.v(Verbose) 详细信息 Log.d(Debug) 调试信息 Log.i(Info) 通知信息 Log.w(Warn) 警告信息 Log.e(Error) 错误信息
- Junit测试: package test; import junit.framework.TestCase; import org.fkjava.hello.MainActivity; /** * 运行的时候选择 Android junit test * @authorhanfeili * */ publicclass TestMainActivity extends TestCase { MainActivity ma = null; /** * 测试的时候初始化操作 */ @Override protectedvoid setUp() throws Exception { super.setUp(); ma = new MainActivity(); } publicvoid testShow(){ assertEquals(ma.show(), false); } /** * 测试完毕释放资源 */ @Override protectedvoid tearDown() throws Exception { super.tearDown(); ma = null; } }
- Monkey自动测试:Monkey Monkey是一个命令行工具,可以运行在模拟器里或实际设备中。它向系统发送伪随机的用户事件流,实现对正在开发的应用程序进行压力测试。Monkey大致分为4大类: · 基本配置选项,如设置尝试的事件数量。· 运行约束选项,如设置只对单独的一个包进行测试。· 事件类型和频率。· 调试选项。例如: adb shell monkey -p com.overfly09.hello -v 500 F:\android\android-sdk-windows\platform-tools>adb shell# monkey -v -p org.facejava.contact 500
- 1-FrameLayout帧布局:是所有布局的基础布局 
- 2-LinearLayout 线性布局:包含垂直布局和水平布局,可以放置多个控件,但是一行(列)只能放置一个组件。所有组件都是按由上到下的排队排成的 设置布局方式 android:orientation="vertical" vertical 垂直布局 horizontal 水平布局 android:layout_width="fill_parent" android:layout_height="fill_parent">
- 3-AbsoluteLayout绝对布局(不推荐使用):通过 X Y 坐标指定位置,当屏幕大小变化,可能显示就会有非常大的差异!
- 4-RelativeLayout相对布局:组件与组件之间有一个依赖关系 如果一个组件变化 可能 会影响整个布局 android:layout_above="@id/tv" 将组件的底部至于指定组件的上面 android:layout_below 将组件的顶部至于指定组件的 android:layout_toLeftOf 将组件的右边缘与指定组件左边缘对齐 android:layout_toRightOf 将组件的左边缘与指定组件右边缘对齐 android:layout_alignBaseline 将组件的baseline与指定组件baseline对齐android:layout_alignBottom 将组件的底部边缘与指定组件底部边缘对齐 android:layout_alignLeft 将组件的左边缘与指定组件右边缘对齐 android:layout_alignRight 将组件的右边缘与指定组件左边缘对齐 android:layout_alignTop 将组件的顶部边缘与指定组件顶部边缘对齐 android:alignParentBottom 设置为true 表示将组件的底部与父组件的底部对齐android:layout_alignParentLeft 设置为true 表示将组件的左边与父组件的左边对齐android:layout_alignParentRight 设置为true 表示将组件的右边与父组件的右边对齐android:layout_alignParentTop 设置为true 表示将组件的顶部与父组件的顶部对齐android:layout_conterHorizontal 设置为true 表示将组件至于水平方向中间android:layout_conterInParent 设置为true 表示将组件至于父组件水平方向和垂直方向中间android:layout_conterVertical 设置为true 表示将组件至于垂直方向中间------------------------------------------------------------------------------------------------------ android:id="@+id/label" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="允许子元素指定他们相对于其它元素或父元素的位置(通过ID指定)。"/>
- 5-TableLayout表格布局: xmlversion="1.0"encoding="utf-8"?> TableLayoutxmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:stretchColumns="1"> TableRow> TextViewandroid:text="学号"android:padding="ip"android:background="#aa0000"/> TextViewandroid:text="姓名"android:padding="ip"android:gravity="center"/> TextViewandroid:text="年龄"android:padding="ip"/> TextViewandroid:text="性别"android:padding="ip"android:gravity="center"/> TableRow> Viewandroid:layout_height="1dip"android:background="#FF909090"/> TableRow> EditTextandroid:text="28"/> EditTextandroid:text="李韩飞"/> EditTextandroid:text="30"/> EditTextandroid:text="男"/> TableRow> Viewandroid:layout_height="1dip"android:background="#FF909090"/> TableRow> EditTextandroid:text="29"/> EditTextandroid:text="李s"/> EditTextandroid:text="31"/> EditTextandroid:text="男"/> TableRow> TableLayout>
- 7-ViewStub延迟加载布局资源:  LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="ViewStub测试"/> ViewStubandroid:id="@+id/myviewstub" android:inflatedId="@+id/other_id" android:layout="@layout/other" android:layout_width="wrap_content" android:layout_height="wrap_content"/> Button android:id="@+id/btn" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="执行测试"/> LinearLayout> -------------------------------------- LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> EditText android:id="@+id/username" android:layout_width="wrap_content" android:layout_height="wrap_content" android:hint="请输入用户名!"/> Button android:id="@+id/login" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="登录"/> LinearLayout> -------------------------- package org.fkjava.viewstub; import android.app.Activity; import android.os.Bundle; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewStub; import android.widget.Button; import android.widget.EditText; publicclass MainActivity extends Activity { @Override publicvoid onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button btn = (Button)findViewById(R.id.btn); btn.setOnClickListener(new OnClickListener() { EditText username =null; publicvoid onClick(View v) { //获得布局中定义的ViewStub对象 ViewStub vs = (ViewStub)findViewById(R.id.myviewstub); //infalte()方法表示填充或者说加载(实例化)ViewStub中通过android:layout="@layout/other" 引入的对应的布局资源 View other = vs.inflate(); //和上面的代码一样的效果 //View other = ((ViewStub)findViewById(R.id.myviewstub)).inflate(); username =(EditText)other.findViewById(R.id.username); Button login = (Button)other.findViewById(R.id.login); login.setOnClickListener(new OnClickListener() { publicvoid onClick(View v) { Log.i("Other-----", username.getText().toString()); } }); } }); } }
- 8-代码方式创建对象:package org.fkjava.codeview; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.Button; import android.widget.LinearLayout; import android.widget.TextView; /** * 代码方式创建对象 * @author hanfeili * */ public class CodeView extends Activity { // 当第一次创建该Activity时回调该方法 @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 创建一个线性布局管理器 LinearLayout layout = new LinearLayout(this); // 设置该Activity显示Layout super.setContentView(layout); //设置布局为垂直布局 layout.setOrientation(LinearLayout.VERTICAL); // 创建一个TextView final TextView show = new TextView(this); // 创建一个按钮 Button btn = new Button(this); btn.setText("测试"); btn.setLayoutParams(new ViewGroup.LayoutParams( ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT)); // 向Layout容器中添加TextView layout.addView(show); // 向Layout容器中添加按钮 layout.addView(btn); // 为按钮绑定一个事件器 btn.setOnClickListener(new OnClickListener() { public void onClick(View v) { show.setText("欢迎进入Android的世界" + new java.util.Date().toLocaleString()); } }); } }
- 1-实例1:aa
- 5-下拉列表:效果图   适配器类型分三种, BaseAdapter 基础适配器 ArrayAdapter 只能展示一行字 SimpleAdapter 最好的扩充性 SimpleCursorAdapter 对数据库的简单结合,可以方便将数据库的内容以列表的形式展示。
- 10-样式和主题:如果在应用使用了主题,同时应用下的view也使用了样式,那么当主题与样式属性发生冲突时, 样式的优先级比主题高。单位 px:是屏幕的像素点 in:英寸 mm:毫米 pt:磅,1/72 英寸 dp:一个基于density的抽象单位,如果一个160dpi的屏幕,1dp=1px dip:等同于dp sp:同dp相似,但还会根据用户的字体大小偏好来缩放。建议使用sp作为文本的单位,其它用dip
- 6-菜单:aa
- 实例2:代码方式创建菜单
- 1-创建:package org.fkjava.activity; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.TextView; /** * Activity的创建过程: * 一个类继承 Activity * 重写onCreate() 进行初始化操作 * 在AndroidManifest.xml中进行新增Activity的注册 * 获得对应的组件,并进行操作。* @authorhanfeili * */ publicclass MainActivity extendsActivity{ publicvoidonCreate(Bundle bundle){ super.onCreate(bundle); //设置本Activity的布局(组件怎么排放) setContentView(R.layout.main); //通过组件的id获得组件对象 final TextView tv = (TextView)findViewById(R.id.textView1); Button myBtn =(Button)findViewById(R.id.mybtn); myBtn.setOnClickListener(new OnClickListener() { publicvoid onClick(View v) { tv.setText("测试成功!"); } }); } }
- 2-注册:xmlns:android="http://schemas.android.com/apk/res/android" package="org.fkjava.activity" android:versionCode="1" android:versionName="1.0"> uses-sdkandroid:minSdkVersion="8"android:targetSdkVersion="15"/> applicationandroid:label="@string/app_name" android:icon="@drawable/ic_launcher" android:theme="@style/AppTheme"> activityandroid:name=".MainActivity" > intent-filter> actionandroid:name="android.intent.action.MAIN"/> categoryandroid:name="android.intent.category.LAUNCHER"/> intent-filter> activity> application> manifest>
- 3-Activity生命周期:Android 程序的生命周期是由系统控制而非程序自身控制。
- 4-数据保存与恢复:package org.fkjava.activitysavedata; import android.os.Bundle; import android.app.Activity; import android.util.Log; import android.view.Menu; import android.widget.EditText; public class MainActivity extends Activity { private static final String TAG = "MainActivity"; EditText firstName,lastName=null; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.i(TAG, "----------onCreate------------"); setContentView(R.layout.activity_main); firstName= (EditText)this.findViewById(R.id.firstname); lastName= (EditText)this.findViewById(R.id.lastname); } /** * 保存实例状态 */ @Override protected void onSaveInstanceState(Bundle outState) { //super.onSaveInstanceState(outState); Log.i(TAG, "----------onSaveInstanceState------------"); //保存数据 outState.putString("first", firstName.getText().toString()); outState.putString("last", lastName.getText().toString()); } /** * 恢复实例状态 * 这个方法并不会与保存方法永远成对调用 * 本类实例本关闭了才会调用进行数据恢复 * 注意 回退是 会 关闭程序的  home是 不会 关闭程序的 横竖屏切换是会重新创建 实例的 */ @Override protected void onRestoreInstanceState(Bundle savedInstanceState) { //super.onRestoreInstanceState(savedInstanceState); Log.i(TAG, "----------onRestoreInstanceState------------"); //获得保存的数据 String first = savedInstanceState.getString("first"); String last = savedInstanceState.getString("last"); firstName.setText(last); lastName.setText(first); } @Override protected void onStart() { Log.i(TAG, "----------onStart------------"); super.onStart(); } @Override protected void onRestart() { Log.i(TAG, "----------onRestart------------"); super.onRestart(); } @Override protected void onResume() { Log.i(TAG, "----------onResume------------"); super.onResume(); } @Override protected void onPause() { Log.i(TAG, "----------onPause------------"); super.onPause(); } @Override protected void onStop() { Log.i(TAG, "----------onStop------------"); super.onStop(); } @Override protected void onDestroy() { Log.i(TAG, "----------onDestroy------------"); super.onDestroy(); } } LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="数据保存和恢复实例"/> EditTextandroid:id="@+id/firstname" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="请输入用户姓!"/> EditTextandroid:id="@+id/lastname" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="请输入用户名!"/> LinearLayout>
- 5-Activity实例化策略:standard (默认模式 ) standard 的加载模式就是每次都创建一个Activity的新实例。singleTop 如果在栈顶存在目标Activity的实例,则将intent发送给该实例,否则创建新的实例并发送给新的实例。singleTask 系统会先在栈中搜索是否存在目标Activity的实例,如果存在就直接将Intent发送给它。否则创建一个新实例再将Intent发送给它。singleInstance singleInstance模式是将一个Activity实例共享给多个Task使用。
- Intent应用范围:启动Activity 1 Context.startActivity() 2 Context.startActivityForResult() 启动服务 1 Context.startService() 启动服务(建立和服务的连接) 2 Context.bindService() 绑定服务 发送广播 通过广播机制发送出去的Intent将会传给所 有 此Intent的Broadcast Receivers
- Intent使用方式:通过Intent 显示启动组件的方式: Intent intent =null; publicvoid onClick(View v) { switch (v.getId()) { case R.id.on //创建Intent的时候指定 启动 目标组件 intent = new Intent(this,OtherActivity.class); break; case R.id.on intent = new Intent(); //通过setClass方法设置 启动 目标组件 intent.setClass(this, OtherActivity.class); break; case R.id.on intent = new Intent(); //通过setComponent方法设置 启动 目标组件 intent.setComponent(new ComponentName(this,OtherActivity.class)); break; case R.id.on intent = new Intent(); //通过setClassName方法设置 启动 目标组件 //参数本应用程序的包名 //参数目标组件的包名+类名 intent.setClassName("org.fkjava.intent", "org.fkjava.intent.OtherActivity"); break; } startActivity(intent); }
- 参数传递:在组件之间进行携带参数跳转有2种方式: 使用Bundle携带(底层就是一个Map的操作) 直接使用Intent携带(底层就是一个Map的操作)
- 带返回的Activity操作:返回处理: 可以自己直接返回 可以手动点击返回
- 隐式Intent: 通常是方便应用程序之间相互 对应 categoryandroid:name="android.intent.category.DEFAULT"/>
- 常用代码:隐式Intent用法实例 //显示网页 Uri uri = Uri.p("http://google.com"); Intent it = new Intent(Intent.ACTION_VIEW, uri); startActivity(it); //显示地图 Uri uri = Uri.p("geo:38.8995-77.036476"); Intent it = new Intent(Intent.ACTION_VIEW, uri); startActivity(it); //其他 geo URI 範例 //geo:latitude,longitude //geo:latitude,longitude?z=zoom //geo:0?q=my+street+address //geo:0?q=business+near+city //google.streetview:cbll=lat,lng&cbp=yaw,,pitch,zoom&mz=mapZoom //路径规划 Uri uri = Uri.p("http://maps.google.com/maps?f=d&saddr=startLat%20startLng&daddr=endLat%20endLng&hl=en"); Intent it = new Intent(Intent.ACTION_VIEW, uri); startActivity(it); //where startLat, startLng, endLat, endLng are a long with 6 decimals like: 50.123456 //打电话 //叫出拨号程序 Uri uri = Uri.p("tel:10086"); Intent it = new Intent(Intent.ACTION_DIAL, uri); startActivity(it); //直接打电话出去 Uri uri = Uri.p("tel:10086"); Intent it = new Intent(Intent.ACTION_CALL, uri); startActivity(it); //发送打电话权限 //传送SMS/MMS //调用短信程序 Intent it = new Intent(Intent.ACTION_VIEW, uri); it.putExtra("sms_body", "The SMS text"); it.setType("vnd.android-dir/mms-sms"); startActivity(it); //发送短信权限: //传送消息 Uri uri = Uri.p("smsto://10086"); Intent it = new Intent(Intent.ACTION_SENDTO, uri); it.putExtra("sms_body", "The SMS text"); startActivity(it); //传送 MMS Uri uri = Uri.p("content://media/external/images/media/23"); Intent it = new Intent(Intent.ACTION_SEND); it.putExtra("sms_body", "some text"); it.putExtra(Intent.EXTRA_STREAM, uri); it.setType("image/png"); startActivity(it); //传送 Email Uri uri = Uri.p("mailto:@abc.com"); Intent it = new Intent(Intent.ACTION_SENDTO, uri); startActivity(it); Intent it = new Intent(Intent.ACTION_SEND); it.putExtra(Intent.EXTRA_EMAIL, "me@abc.com"); it.putExtra(Intent.EXTRA_TEXT, "The email body text"); it.setType("text/plain"); startActivity(Intent.createChooser(it, "Choose Email ")); Intent it=new Intent(Intent.ACTION_SEND); String[] tos={"me@abc.com"}; String[] ccs={"you@abc.com"}; it.putExtra(Intent.EXTRA_EMAIL, tos); it.putExtra(Intent.EXTRA_CC, ccs); it.putExtra(Intent.EXTRA_TEXT, "The email body text"); it.putExtra(Intent.EXTRA_SUBJECT, "The email subject text"); it.setType("message/rfc822"); startActivity(Intent.createChooser(it, "Choose Email ")); //传送附件 Intent it = new Intent(Intent.ACTION_SEND); it.putExtra(Intent.EXTRA_SUBJECT, "The email subject text"); it.putExtra(Intent.EXTRA_STREAM, "file:///sdcard/mysong.mp3"); sendIntent.setType("audio/mp3"); startActivity(Intent.createChooser(it, "Choose Email ")); //播放多媒体 Uri uri = Uri.p("file:///sdcard/song.mp3"); Intent it = new Intent(Intent.ACTION_VIEW, uri); it.setType("audio/mp3"); startActivity(it); Uri uri = Uri.withAppendedPath(MediaStore.Audio.Media.INTERNAL_CONTENT_URI, "1"); Intent it = new Intent(Intent.ACTION_VIEW, uri); startActivity(it); //Market 相关 //寻找某个应用 Uri uri = Uri.p("market://search?q=pname:pkg_name"); Intent it = new Intent(Intent.ACTION_VIEW, uri); startActivity(it); //where pkg_name is the full package path for an application //显示某个应用的相关信息 Uri uri = Uri.p("market://details?id=app_id"); Intent it = new Intent(Intent.ACTION_VIEW, uri); startActivity(it); //where app_id is the application ID, find the ID //by clicking on your application on Market home //page, and notice the ID from the address bar //Uninstall 应用程序 Uri uri = Uri.fromParts("package", strPackageName, null); Intent it = new Intent(Intent.ACTION_DELETE, uri); startActivity(it); //定位sdcard上的资源 File file = new File("mnt/sdcard/fkjava.png"); Intent intent = new Intent(Intent.ACTION_VIEW); intent.setDataAndType(Uri.fromFile(file), "image/*"); startActivity(intent);
- 10-存储策略:aa
- 2-文件操作:android 的文件数据保存支持 A:本应用程序包保存 B:外部设备SDcard保存 
- 3-网络操作:如果手机没有
- 4-SQLite数据库:SQLite大量的被用于手机,PDA,MP3播放器以及机顶盒设备。列举了一些使用SQLite作为嵌入式服务器的应用: Mozilla Firefox使用SQLite作为数据库。Mac计算机中的包含了多份SQLite的拷贝,用于不同的应用。PHP将SQLite作为内置的数据库。Skype客户端软件在内部使用SQLite。SymbianOS(智能手机操作平台的领航)内置SQLite。AOL邮件客户端绑定了SQLite。Solaris 10在启动过程中需要使用SQLite。McAfee杀毒软件使用SQLite。iPhones使用SQLite。嵌入式关系型SQLite介绍
- ContentProvider实现和调用步骤:实现 数据暴露的ContentProvider 类 步骤: 1 :写一个类继承 ContentProvider 抽象类 重写 需要暴露给第三方应用调用的方法  onCreate() 初始化方法,在应用程序安装的时候调用一次 如果需要提供新增方法给第三方应用需要 重写 insert()方法 如果需要提供查询方法给第三方应用需要 重写 query()方法。在AndroidManifest.xml注册 需要暴露数据的ContentProvider providerandroid:name="org.fkjava.db.UserContentProvider" android:authorities="org.fkjava.usercontentprovider"/> content://org.fkjava.usercontentprovider/stu 第三方应用调用 通过 this.getContentResolver().insert(uri ,,)调用暴露的新增方法 通过 this.getContentResolver().query(uri ,,)调用暴露的查询方法。
- Uri代码:通过Uri判断具体是什么操作,是否允许请求的操作 static { //UriMatcher 相当是一个uri容器,当有第三方请求过来的时候将请求的带的uri与UriMatcher中的所有uri进行匹配,匹配成功的返回第三部分值,如果没有一个匹配的将返回 -1 (NO_MATCH) uriMatcher = new UriMatcher(UriMatcher.NO_MATCH); // http://www.fkjava.org/user.html // content://org.fkjava.usercontentprovider/user uriMatcher.addURI(authorities, "user", USER); // content://org.fkjava.usercontentprovider/user/8 // #表示 匹配id 部分 * 表示匹配任何数据 uriMatcher.addURI(authorities, "user/#", USER_ID); } //uri匹配实例 @Override public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { db = dbHelper.getReadableDatabase(); // 当调用某个操作的时候,如果第三方应用传递的uri与uriMatcher中的某uri匹配的时候将返回 //uriMatcher.addURI(authorities, "user/#", USER_ID)方法的第3个参数部分,如果没有与任何一个uri匹配将返回 -1 (UriMatcher.NO_MATCH) if(uriMatcher.match(uri) == USER){ cursor = db.query(...); }elseif(uriMatcher.match(uri) == USER_ID){ //从uri上解析id数据 long id = ContentUris.pId(uri); String where = " id = "+id; cursor = db.query(...); } returncursor; }
- 数据变化:通知
- 13-JSON和XML解析:无论在PC还是移动端都有可能需要涉及数据的跨平台传输. 一般会选择XML 或者 JSON 推荐多使用JSON
- 14-Service服务:通过startService()启动的服务需要通过stopService()或selfService()停止 会经过:onCreate()->onStartCommand()->runing-->onDestroy() 调用者和服务之间没有联系 通过bindService()启动的服务需要通过unbindService()停止 会经过:onCreate()->onBind()->runing-->onUnbind()-->onDestroy() 调用者和服务之间有联系 Service是通过其他组件启动的,虽然在后台运行,但是仍然是的主线程中 Service是android为开发者提供的一个开辟子线程,进行耗时操作的机会。IntentService  使用 startService() 一般适用于 本应用内部调用,并且不需要获取服务端的数据 因为使用startService()启动的服务和调用组件之间没有关系 使用bindService() 一个适用于 不同的进程之间进行调用,并需要获取服务端的数据。因为使用bindService()启动的服务和调用组件之间可以建立联系。使用IntentService 可以不用管理线程的创建会关闭 可以简化线程操作
- 正常广播:MainActivity
- 有序广播:aY
- 广播注册:常驻广播注册
- 短信实例:SMSListener
- HTML页面代码:HTML>HEAD>TITLE>我们自己的服务器TITLE> metahttp-equiv=content-typecontent="text/html; cht=utf-8"/> script> function sayHello(v){ if(v){ alert("大家好!"+v); document.getElementById("msg").innerHTML="hi_"+v; }else{ alert("同学们好~"); } } function sayHello2(v){ document.getElementById("msg").innerHTML="用户ID"+v.id+"-用户名-"+v.name; } //获取输入框中的数据,发送给java对象 function sendMsgtoJava(){ //获取数据 var name = document.getElementById("name").value; //发送给java对象的方法 window.obj.show3("您好:"+name); } function sayHello4(){ document.getElementById("msg").innerHTML="handler_操作"; } script> HEAD> BODY> P> H3>访问本应用程序中的html页面H3> divid="msg">div> ul> 用户名:inputtype="text"name="name"id="name"value="tom">br> 密 码:inputtype="password"name="password">br> inputtype="on"value="测试1"onclick="sayHello()">br> ahref="javascript:sayHello()">页面直接调用sayHello函数a>br> inputtype="on"value="测试show()"onclick="window.obj.show();">br> inputtype="on"value="测试show2()"onclick="window.obj.show2();">br> inputtype="on"value="测试show3()"onclick="sendMsgtoJava()">br> inputtype="on"value="测试show4()"onclick="window.obj2.show4();">br> ul> BODY>HTML>
- 17-动画:
- 渐变动画:渐渐的变化的动画 渐渐变化 位置 渐渐变化 透明度 渐渐变化 旋转 渐渐变化 缩放
- 帧式动画:一张一张 播放 图片效果
- 动画:package org.fkjava.anim; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.util.Log; import android.view.MotionEvent; import android.view.View; import android.view.animation.AlphaAnimation; import android.view.animation.Animation; import android.view.animation.Animation.AnimationListener; import android.widget.Button; public class AActivity extends Activity implements View.OnClickListener,AnimationListener{ private static final String TAG = "AActivity"; Button btn = null; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); btn = (Button) findViewById(R.id.on1); btn.setOnClickListener(this); } @Override public void onClick(View v) { Animation anim = new AlphaAnimation(1.0f, 0.0f); anim.setDuration(5000); //设置动画处理器 anim.setAnimationListener(this); btn.setAnimation(anim); } /** * 触屏 事件 */ @Override public boolean onTouchEvent(MotionEvent event) { if(event.getAction() == MotionEvent.ACTION_MOVE){ Intent intent = new Intent(this,BActivity.class); this.startActivity(intent); //2.0之后 才可以使用 实现 Activity之间的动画跳转 //overridePendingTransition 一定是在startActivity 方法之下调用 this.overridePendingTransition(R.anim.push_up_in,R.anim.push_up_out); return true; } return super.onTouchEvent(event); } @Override public void onAnimationStart(Animation animation) { Log.i(TAG, "------动画开始---------"); } @Override public void onAnimationEnd(Animation animation) { Log.i(TAG, "------动画结束---------"); } @Override public void onAnimationRepeat(Animation animation) { Log.i(TAG, "------动画重复---------"); } }
- 动画转场效果:Intent intent = new Intent(this,BActivity.class); this.startActivity(intent); //2.0之后 才可以使用 实现 Activity之间的动画跳转 //overridePendingTransition 一定是在startActivity 方法之下调用 //this.overridePendingTransition(R.anim.zoom_in,R.anim.zoom_out); this.overridePendingTransition(R.anim.left_in,R.anim.left_out);
- 18-多媒体操作:hN
- 综合实例:调用系统的镜头,实现拍照 和 录视频 调用系统的mac实现 录音 (电话)
- 19-游戏框架代码实现思路:
- 开发中常见问题:遇到的错误多了,经验才丰富,解决问题速度才快,所以遇到问题我们应该开心的面对,积极的解决!
Comments (0)