android 知识积累
16lz
2022-04-12
R.id.stringidR.string.valuestrR.layout.sssdR.java 是资源文件的映射类R类为每份资源定义一个内部类android:id="@+id/ok" 在R类中id内部类中新增一个ok的属性 R.id.ok变量(Button)findViewById(R.id.ok)可以获取对应的控件android:label = "@string/test"android清单文件 AndroidManifest.xml 整个应用的全局描述文件 每个项目中必须存在的文件定义权限 uses-permission android应用由一个或多个基本组件所组成(activity-用户交互组件和view-显示UI组件 用户实实在在看到的组件 需要放入activity)view要显示则应该调用activity中的setContentView(R.layout.<资源文件名称>)方法 参数是需要显示的View对象也可以通过findViewById(R.id.<UI对应的ID>)大部分的视图组件放入到 android.widget 和 android.view中Button btn = new Button(this); 通过new可以创建所有的View组件 参数都是thisbtn.setOnClickListener(new OnClickListener(){ @Override public void onClick(View v){ }})--线形布局<LinearLayout android:id="@+id/ok" android:orientation:"vertical" android:layout_width="fill_parent" android:height="fill_parent"> wrap_content 和fill_parentandroid:gravity设置所有组件对其方式RelativeLayout相对布局android:background="@drawable/bk"GridLayout--控件分类TextView EditText 属性几乎可以共用 android:textSize="10pt"android:inputType="number"设置输入的类型是数字的Button RadioGroup RadioButton CheckBoxRadioGroup点击条目时响应的方法 setOnCheckedChangeListenerListView ListActivity --继承列表activity继承ListActivity类ListView GridView Spinner 都是容器而 adapter是加载项 和内容和显示的样式有关Adapter常见实现类有 ArrayAdapter SimpleAdapter SimpleCursorAdapter BaseAdapterandroid:orientation="vertical"list.setOnItemClickListener(new OnItemClickListener(){ @Override public void onItemClick(){ }});android:layout_height="240dp" 可以设置具体的大小android:layout_width="240dp""@string/status"ListActivity是Activity当中需要继承的 ListView是XML中的List关联标签事件 分为 注册事件和回调事件 setXxxListener就是注册事件 事件源(Button) 事件 事件监听器KeyEvent.KEYCODE_A 表示键盘中的A键setLongClickListener长时间点击事件因为事件的监听一般只写一次 因此一般使用匿名内部类通常建议使用匿名内部类作为监听器btn.setOnClickListener(new OnClickListener(){ @Override public void onClick(View v){ }});同样也可以直接绑定到标签中<Button android:onClick="doOnClick" /> 在Activity类中定义doOnClick方法 public void doOnClick(View source)Activity主要作用是完成界面初始化的工作Handler消息传递机制只允许UI线程处理UI组件继承Handler类 覆盖的方法有handleMessage与Handler相关的类有 Message Looper MessageQueue ;Handler handler = new Handler(){ @Override public void handleMessage(Message msg){ Bundle bundle = msg.getData(); bundle.getString("paramString"); bundle.getInt("paramInt"); bundle.putString("paramName","paramValue"); }};Bundle bundle = new Bundle();bundle.putString("paramName","paramValue");bundle.putInt();SELECT * FROM TEXMPAPER ;Toast.makeText(this,content,short).show();progressBar.setProgress(i);ListActivity ListViewTabActivity TabHostActivity必须在AndroidManifest.xml中注册多个Activity组成Activity栈当前活动的Activity位于栈顶继承Activity类 并重写onCreate方法 在被创建时调用在Activity中启动另一个Activity方法 startActivity(Intent)Intent intent = new Intent(OneActivity.this,TwoActivity.class);startActivity(Intent) --从OneActivity跳转到TwoActivity调用finish方法结束某个Activity使用Bundle用于不同Activity之间数据传递Intent提供的方法putExtras(Bundle);Bundle getExtras();--在Activity中获取意图Intent intent = getIntent();Bundle bundle = intent.getExtras();Activity四种加载模式 standard(每次都会创建新的Activity实例) singletop(如果栈顶有该Activity实例则不创建新Activity实例) singletask(同一个Task只有一个Activity实例) singleinstance(永远只会创建一个Activity实例)AndroidManifest.xml中的<intent-filter/>定义了第一次调用的Activity --所有activity必须要在清单文件中声明 否则不起作用<activity android:name=".OneActivity">资源文件分两类 可以用R资源清单类访问的 一般在res目录下 和 不能用R清单类进行访问的资源 一般在assets目录下可以通过Resource类进行获取对应的资源文件的实际值Resource res = getResources();--获取字符串资源String str = res.getText(R.string.strId);--获取图片资源Drawable draw = res.getDrawable(R.drawable.logoId);--获取数组类型资源int[] intArr = res.getIntArray(R.array.arrayId);在XML中使用资源信息@resource_type/resource_name 如 @id/stringId <resources><color name='red'>#dddd</color> @color/red <string name='key'>value</color> @string/key</resources><array name="array_a"> <item>@string/key</item> --可以引用其他资源信息 <item>item2</item></array>getResources().getStringArray(R.array.array_a); --获得字符串数组<ListView android:entries="@array/array_a">BitMap相当于一张位图绘图关键类 Canvas PaintSharedPreferences主要保存简单的Key-Value键值对SharedPreferences是一个借口 只能通过Context调用的getSharedPreferences(name,mode)来获得SharedPreferences实例读SharedPreferences数据用sharedPreferences.getString("xxx",null) 或者 getInt()写数据 则用 Editor editor = sharedPreferences.edit();editor.putString("xxx","valueString");editor.putInt("xxx","valueInt");--弹出一个小的提示框Toast.makeText(this,"显示内容",Toast.LENGTH_LONG).show();Android中的应用程序的包名来作为该应用程序的标示--获得其他应用程序的SharedPreferencesContext context = createPackageContext("应用程序对应的包名",Context.CONTEXT_IGNORE_SECURITY);context.getSharedPreferences("count",CONTEXT.MODE_WORLD_READABLE);--File存储FileInputStream openFileInput(String name) ;FileOutputStream openFileOutput(String name) ;SD卡的地址File file = Environment.getExternalStorageDirectory() ;如果要在SD卡读写数据必须要在清单文件(AndroidManifest.xml)文件定义权限--SD卡中创建和删除文件的权限<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS">--SD卡中写入数据的权限<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE">注册Provider<provider android:name=".DDDProvider" android:authorities="uri.dd" android:exported="true"> uri.dd是Uri域名android:exported用于指定是否可以被其他应用程序调用uri --> content://uri.dd/word/2 访问uri.dd下的 word的数据为2的数据ContentResolver会通过uri找到对应的ContentProvider来进行CRUD操作A调用ContentResolver对应的insert方法时对调用uri对应的ContentProvider来进行insert操作编写自己的XxxContentProvider需要继承ContentProvider类 重写 insert query update delete等方法 然后配置ContentProvider Uri uri = Uri.parse("content://uri.dd/");ContentResolver resolver = getContentResolver();resolver.query(uri,param..);ContentResolver所有的方法的第一个参数是uriContentObserver用于监听ContentProvider的数据变化定义Service的子类 然后在清单文件中定义该Service Service只运行于后台<service android:name=".XxxService"> <intent-filter> <action android:name="xxxx.xxx.service"> </intent-filter></service>启动Servicefinal Intent intent = new Intent();intent.setAction("xxxx.xxx.service");startService(intent);停止ServicestopService(intent);AIDL Service 跨进程之间的通信AIDL定义的源代码必须要以.aidl结尾cat.aidlpackage dddinterface ICat{ String getColor(); double getWidth();}ADT工具会自动生成ICat.java文件 ICat实现了IBinder和ICat两个接口TelephonyManager电话管理器TelephonyManager telephonyManager = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);SmsManager短信管理器SmsManager smsManager = SmsManager.getDefault();smsManager.sendTextMessage(对面号码,null,内容,PendingIntent.getActivity(this,0,new Intent(),0),null);PendingIntent是可以发送到其他应用组件的Intent授予发送短信的权限 <uses-permission android:name="android.permission.SEND_SMS" />AudioManager音频管理器--播放外部音乐MediaPlayer mediaPlayer = new MediaPlayer();Uri uri = Uri.parse("http://xxxx/xx/xx.mp3");mediaPlayer.setDataSource(this,uri);-- 准备播放音乐mediaPlayer.prepare();-- 播放音乐mediaPlayer.start();VideoView播放视频 是一个标签 相当于 ImageViewSELECT * FROM THRSDEPTREQUEST FOR UPDATE ;ServerSocket建立服务器WebView浏览网页Android内置了HttpClient可以很好的进行http请求和http响应ServerSocket--服务端try {ServerSocket ss = new ServerSocket(3000); --监听3000端口是否有连接进来 如果有则写入你好!!while(true){Socket socket = ss.accept() ;OutputStream out = socket.getOutputStream();out.write("你好!!".getBytes());out.close() ;socket.close();}} catch (IOException e) {e.printStackTrace();}--客户端try {Socket s = new Socket("127.0.0.1", 3000);BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));System.out.println(br.readLine());} catch (UnknownHostException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}添加访问互联网的权限<uses-permission android:name="android.permission.INTERNET">--加载网页信息<WebView android:id="@+id/test" android:width="fill_parent" android:height="wrap_content">WebView test = (WebView) findViewById(R.id.test);test.loadUrl(url);ImageView 来加载静态图片 也使用AnimationDrawable来开发逐逐帧动画ImageView image ;BitmapDrawable drawable = (BitmapDrawable)image.getDrawable();--为ImageView设置图片资源image.setImageBitmap(BitmapFactory.decodeStream(inputStream));Bitmap bitmap = drawable.getBitmap();--BitmapDrawable就是封装了Bitmap的drawableBitmapDrawable drawable = new BitMapDrawable(bitmap);Bitmap.createBitMap(BitMap source, int x,int y ,int width,int height);--BitmapFactory是Bitmap一个工具类 可以从不同的数据源解析创建Bitmap对象Bitmap bitmap = BitmapFactory.decodeResource(Resources res,int drawableId) ;从xml中解析图片资源Bitmap bitmap = BitmapFactory.decodeFile(String pathName); 从文件路径获取Bitmapassets目录管理器AssetManager assetManager = getAssets();String imageArr[] = assetManager.list();InputStream inputStream = assetManager.open(imageArr[0]);--为ImageView设置图片ImageView.setImageBitmap(BitmapFactory.decodeStream(inputStream));可以获得一张位图的某一块图片绘图基础 Canvas Paint Path Canvas是依附于View的画布绘图应该继承View类 并重写onDraw(Canvas canvas)Canvas对应的各种方法drawXxx() 可以绘制各种图形 比如直线 点 圆 还提供了 旋转(rotate) 移动(translate) 缩放(scale) 倾斜(skew)Paint代表的是在Canvas上的一个画笔 可以表示 填充颜色 风格 Paint.setColor()Paint.setStyle()一个自定义View组件 需要重写View类的onDraw(Canvas canvas) 方法 把需要绘制的内容放在 onDraw方法中TextView extends View{ public TextView(Context context){ // do something } @Override public void onDraw(Canvas canvas){ Paint paint = new Paint(); canvas.drawTextOnPath(); --画一张图片 canvas.drawBitmap(bitMap,0,0,paint); canvas.drawPath(path,paint); }}--显示TextViewsetContentView(new TextView(this));动画其实就是不断重复调用View组件上的onDraw(Canvas canvas)方法如果每次在View组件上绘制的图形不同 就成了动画的效果每次View组件上的图形状态数据发生变化 都应该通知View组件重写调用onDraw(Canvas canvas)重写绘制图片通知View重绘 可调用invalidate(在UI线程中)或postInvalidate(非UI线程中)--创建菜单 boolean onCreateOptionsMenu(Menu menu){ MenuInflator inflator = new MenuInflator(this); //把定义好的菜单赋给menu inflator.inflate(R.menu.myMenu,menu); return onCreateOptionsMenu(menu);}--菜单选中 点中菜单时的响应boolean onOptionsItemSelected(MenuItem item)WindowManager windowManager = getWindowManager();Display dis = windowManager.getDefaultDisplay();DisplayMetrics metrics = new DisplayMetrics();dis.getMetrics(metrics);--获取屏幕宽度int windowWidth = metrics.widthPixels;--获取屏幕高度int windowHeight = metrics.heightPixels;final GameView gameView = new GameView(this);setContentView(gameView);Handler handler = new Handler(){@Override public void handleMessage(Message message){ if(message.what == 0x123){ --通知重写绘图 gameView.invalidate(); } }};final Timer timer = new Timer();timer.schedule(new TimerTask(){@Override public void run(){ ballX += xSpeed ; ballY += ySpeed ; handler.sendEmptyMessage(0x123); }},0,300);--图形组件类public class GameView extends View{ Paint paint = Paint(); public GameView(Context context){ super(context); --使当前视图获得焦点 setFocusable(true); } @Override public void onDraw(Canvas canvas){ paint.setStyle(Paint.Style.FILL); --设置去锯齿 paint.setAntiAlias(true); if(isLose){ paint.setColor(Color.RED); paint.setTextSize(20); --生成一个已结束的Text canvas.drawText("游戏已结束",50,200,paint); }else{ --绘制小球 paint.setColor(Color.rgb(240,240,80)); canvas.drawCircle(ballX,ballY,12,paint); --绘制球拍 paint.setColor(Color.rgb(80,80,200)); canvas.drawRect(racketX,racketY,racketX+RACKET_WIDTH,racketY+RACKET_HEIGHT,paint); } }}--对图形特效的处理--对图形进行平移(setTranslate) 旋转(setRotate) 缩放 (setScale)Matrix matrix = new Matrix();--获得图片资源BitMap bitmap = ((BitMapDrawable)getResources().getDrawable(R.drawable.xxx)).getBitMap();--matrix设置--旋转matrix.setSkew(12,0);--缩放 缩放比例matrix.setScale(1.0f);然后利用BitMap bitMap2 = BitMap.createBitmap(bitmap,0,0,width,height,matrix,true) 图片就会和matrix设置的内容进行变换--画布重新绘制新位图资源canvas.drawBitmap(bitMap2,matrix,null);在onDraw方法中进行图片转换设置按键事件的定义SELECT * FROM thrsdeptrequest FOR UPDATE ;gameView.setOnKeyListener(new OnKeyListener(){@Override public void onKey(View source,int keyCode,KeyEvent event){ --按键时 对某些键进行绑定业务逻辑 如按A和D键分别做相应的事件 switch(event.getKeyCode()){ case KeyEvent.KEYCODE_A: --DO SOMETHING break ; case KeyEvent.KEYCODE_D: --DO SOMETHING break ; } }});ImageView --定时任务对象final Timer timer = new Timer();-- 每100毫秒执行一次timer.schedule(new TimerTask(){@Override public void run(){ handler.sendEmptyMessage(0x123); }},0,100) ;--handler的作用是重新绘制游戏界面的生成final Handler handler = new Handler(){ @Override public void handleMessage(Message message){ if(message.what == 0x123){ --游戏界面重新绘制 gameView.invalide(); } }};--获取位图Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(),R.drawable.plane);--获取图片宽度bitmap.getWidth();--获取图片高度bitmap.getHeight();Canvas 还提供了对扭曲图的支持invalidate();方法通知View组件进行重新绘制drawBitmapMesh方法--触摸屏幕事件public void onTouchEvent(MotionEvent event){ --获取点击处的 X Y坐标 event.getX(); event.getY(); return true ;}逐帧(Frame)在xml中定义逐帧动画用 xxx.xml<animation-list android:oneshot="true|false"> oneshot 设置是否循环播放<item android:drawable="@drawable/test" android:duration="1"/> 定义每一帧的图片和持续的时间</animation-list><item >java代码中使用 AnimationDrawable 提供的两个方法 start和stop方法ImageView imageView = (ImageView)findViewById(xxx);xxx表示xml的文件名称AnimationDrawable animationDrawable = (AnimationDrawable)imageView.getBackground();指定点爆炸 其实就是逐帧动画加载音效 声音文件放置在raw文件夹下面MediaPlayer boom = MediaPlayer.create(this,R.raw.boom); boom.start() --播放音乐R.anim.blast 表示一个逐帧动画 逐帧动画一般放置在anim文件夹下面imageView.setBackgroundResource(R.anim.blast);imageView.setVisibility(View.INVISIBLE) ;imageView.setVisibility(View.VISIBLE) ;imageView.setLocation();AnimationDrawable animationDrawable = (AnimationDrawable)imageView.getBackground();animationDrawable.start(); --启动动画FrameLayout frame = new FrameLayout(this);frame.setBackgroundResource(R.drawable.xxx);frame.addView(myView);点击屏幕事件 frame.setOnTouchListener(new OnTouchListener(){ @Override public void onTouch(View source,TouchEvent event){ if(event.getAction == TouchEvent.ACTION_DOWN){ anim.stop(); myView.setLocation(event.getX()-40,event.getY()-20); anim.start(); --播放声音 mediaPlayer.start(); } }});--少量数据的存储使用SharedPrefences 是以key-value的形式存储数据 接口本身没有写入数据的能力SharedPrefences.edit() -- > Editor对象来实现数据的修改getXxx Xxx可以是int double boolean float StringSharedPrefences是一个借口 所以只能通过getSharedPrefences("xxx",MODE_WORLD_READABLE);SharedPrefences sp = getSharedPrefences("xxx",MODE_WORLD_READABLE);sp.getString("xx","默认值"); 如果xx对应的值不存在 则获得 第二个参数 即设置的默认值SharedPrefences.Editor editor = sp.edit();editor.putString("xx","12345");--提交所有值editor.commit();SharedPrefences总是以XML的格式保存数据保存在路径 /data/data/<package name>/shared_prefes/ 目录下面获取其他应用程序的SharedPrefences其实就是需要获得该应用程序的ContextContext context = createPackageContext("包名",Context.IGNORE_SECURITY);SharedPrefences sp = context.getSharedPrefences("xxx",MODE_WORLD_READABLE);sp.getInt("xxx",0);--io 流openFileInputStream(String name)openFileOutputStream(String name)--获得SD卡路径File sdCardFile = Environment.getExternalStorageDirectory();String sdPath = sdCardFile.getCanonicalPath();--SD卡写入数据权限<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE">--SQLite数据库 其实就是一个文件 /mnt/data/目录下SQLite数据库其实是通过SQLiteDatabase来操作的一般通过继承SQLiteOpenHelper来获得子类 然后通过getReadableDatabase() getWritableDatabase() 来获得 SQLiteDatabase实例--SimpleAdapter 用法List<Map<String,String>> list = new ArrayList<String,String>();list.put("name1","");list.put("name2","");SimpleAdapter simpleAdapter = new SimpleAdapter(this,list,R.layout.listxx,new String[]{"name1","name2"},new int[]{R.id.name1xxx,R.id.name2xxx});第三个参数是list整体样式第四个参数是与list对应的key值第五个参数是每个内容显示的样式信息ListView listView = (ListView)findViewById(R.id.xx);listView.setAdapter(simpleAdapter);SQLiteDatabase database ;Service继承Service类 然后在 AndroidManifest.xml中定义Intent intent = new Intent();intent.setAction("xxx.xx.First_Service");--参数是AndroidManifest.xml中设置service下的action名称startService(intent);<service android:name=".FirstService"> <intent-filter> <action android:name="xxx.xx.First_Service"> </intent-filter></service>stopService(intent);service总是在后台运行而不显示在前天绑定本地service与之通信IntentService和Service的区别 就是 IntentService会调用单独的线程来处intentIntentService只需要重写onHandleIntent(Intent intent)方法 不需要重写 onBind和onStartCommand方法IntentService是使用单独的线程来完成耗时任务而不会阻塞前台线程 因此前台界面不会失去响应IntentService会自动停止 而不需要调用stopSelfIntentService是Service的子类 它有一些额外的功能startService(intent) stopService(intent)一些重要的系统Service--电话serviceTelephonyManager telephonyManager = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE) ;--短信管理器SmsManagerSmsManager sManager = SmsManager.getDefault();PendingIntent pendingIntent = PendingIntent.getActivity(this,0,new Intent(),0) ;--发送短信sManager.sendTextMessage(numberStr,null,contentStr,pendingIntent,null) ;--发送短信需要设置权限 <uses-permission android:name="android.permission.SEND_SMS">--音频管理器AudioManager audioManager = (AudioManager)getSystemService(Service.AUDIO_SERVICE) ;--闹钟管理器AlarmManager.set--接收广播消息BroadcastReceiver 专门负责监听各种应用程序发出的Broadcast<receveiver android:name=".FirstReceveiver" ><intent-filter android:priority="0"> android:priority --指定优先等级 值越大优先级越高 <action android:name="xxx.xxx"> </intent-filter></receveiver>Intent intent = new Intent();intent.setAction("xxx.xxx");sendBroadcast(intent);--普通的Broadcast不能传给下一个消息接收者sendOrderedBroadcast(intent);--排序的Broadcast可以传给下一个消息接收者 先后顺序可以用 android:priority来定义SELECT * FROM THRSRESUME FOR UPDATE ;SELECT * FROM TPUBCOUNTER FOR UPDATE;BroadcastReceiver可以监听各个应用IntentService是Service的子类 不是普通的Service 增加了些额外的功能--Activity生命周期1 onCreate --第一次创建时2 onStart --用户可以看到界面时3 onResume --用户获取焦点时4 onPause --与用户失去焦点5 onRestart --用户重新获得界面时6 onStop --界面用户不可见时7 onDesdroy--调用finish方法时--消息队列中存放两种信息的队列 有线程对象(Runnable)和消息对象(Message)Handler handler = new Handler();handler.post(runnable);handler.postDelayed(runnable,3000);Handler handler = new Handler(){ public void handleMessage(Message msg){ Bundle bundle = msg.getData(); bundle.getString(""); }};public MyHandler(Looper looper){ this.looper = looper ;}Message msg = handler.obtainMessage();Bundle bundle = new Bundle();bundle.putStringbundle.putInthandler.sendMessage(msg);handleMessage(Message msg)ListActivityListViewTabActivityTabHostsetListAdapter(simpleAdapter);handleMessage(Message msg)msg.setData(bundle);bundle.putString("paramName","paramValue");bundle.putInt("paramName",paramValue);-- 系统自带的线程处理类HandlerThread thread = new HandlerThread();MyHandler handler = new MyHandler(thread.getLooper());Message message = handler.obtainMessage();message.sendToTarget();-- looper的作用就是使handler的线程与activity的线程分开 不会使main线程阻塞singleTask 如果在Task中存在栈顶中如果存在该Activity实例则不重新创建public MyHandler(Looper looper){ super(looper);}public void handleMessage(Message msg){ --处理逻辑}Context context = createPackageContext("xxx.io",xxx);Context context = createPackageContext("xx.io",xxx);SharedPreferences sharedPreferences = context.getSharedPreferences();Editor editor = sharedPreferences.edit();以键值对的形式保存在对应的XML中SELECT TE.*,TD.DEPTNAME FROM THRSEMPLOY TE,TUSCDEPT TD WHERE TE.DEPTID = TD.DEPTID(+)SELECT WM_CONCAT(ROWNUM) FROM DUAL CONNECT BY ROWNUM <= 10;singleInstance 只会创建一个目标Activity实例 并会使用一个全新的Task栈 来装载Activity实例singleTask 目标Activity在同一个Task中只含有一个实例 1.如果不存在则会创建新的Activity实例 并放入栈顶2.如果位于栈顶则不会创建新的Activity实例3.如果实例存在但不在栈顶 则把上面的实例从Task栈中移除 使得该实例位于Task栈顶singleTop 如果目标Activity实例位于Task栈顶 则不会新创建对应的实例 否则会创建新的Activity实例standard 每次都会创建一个新的目标Activity实例 而不会创建一个新的Task 并把Activity加入到对应的Task中WITH T1 AS (SELECT ROWNUM AS N1 FROM DUAL CONNECT BY ROWNUM < 10),T2 AS (SELECT 5 AS N2 FROM DUAL)SELECT T1.N1, T2.N2 FROM T1, T2 WHERE T1.N1 = T2.N2(+);Looper使handler处理的线程不是与activity main线程同一个SQLiteOpenHelper是抽象类所以要继承它 并必须重写构造函数public DatabaseOpenHelper(Context context,String name,CursorFactory factory,int Version)所继承的方法中有方法 onCreate onUpgrade 方法 分别是创建数据库还有升级数据库时调用的方法调用getReadableDatabase()或getWritableDatabase()则创建一个数据库 会调用onCreate方法如果 DatabaseOpenHelper helper = new DatabaseOpenHelper(this,"数据库名字",null,2); 当版本指定为2时说明是升级数据库 则会调用onUpgradeSQLiteDatabase db = helper.getWritableDatebase();db.execSQL("CREATE TABLE TEST (ID INT)");ArrayAdapter adapter = new ArrayAdapter(this,R.layout.xxx,数组或list);listView.setAdapter(adapter);继承ListActivity 或者直接使用ListView标签进行使用--插入操作--键值对的对象 键是表示列名ContentValues content = new ContentValues();--key是表中的列名content.put("id",1000);--插入一条数据db.insert("Test",null,content);--更新数据ContentValues content = new ContentValues();content.put("name","9999")db.update("Test",content,"id=?",new String[]{"1"});--把id为1的name设置成9999SQLiteDatabase db = helper.getReadableDatabase();Cursor cursor = db.query("Test",new String[]{"name","id"},);-- 遍历cursorwhile(cursor.moveToNext()){ String name = cursor.getString(cursor.getColumnIndex("name")); sysout(name);}ContentValues SQLiteOpenHelper Bundle bundle = new Bundle();bundle.putStringbundle.putIntbundle.putFloatbundle.putDouble SELECT T.PID, COUNT(T2.N) FROM TEXMPAPER T, (SELECT 90 N FROM DUAL) T2 WHERE T.PID = T2.N(+) GROUP BY T.PID;SELECT WM_CONCAT(ROWNUM) FROM DUAL CONNECT BY ROWNUM<=10 ;--多行的同一列合并成同一行SELECT WM_CONCAT(T.PID) FROM TEXMPAPER T ;MediaPlayer提供下列方法进行对音频文件进行操作start();stop();pause();create();setDatasource();setDatasource调用该方法后并没有完全准备好 需要调用prepare()方法然后再调用start等方法播放网络上的音频文件MediaPlayer player = new MediaPlayer();Uri uri = Uri.parse("http://xxx/xx.mp3");player.setDatasource(context,uri);--准备声音player.prepare();player.start();--还有个准备方法 异步准备音频文件 不会阻塞UI线程player.prepareAsync();--播放视频VideoView 和 MediaControllerVideoView videoView = (VideoView)findViewById(R.id.xxx);MediaController mController = new MediaController(this);File file = new File("/mnt/xxx.mp4");--把视频显示在VideoView组件上videoView.setVideoPath(file.getAbsolutePath());--把VideoView和MediaController结合起来videoView.setMediaController(mController);mController.setMediaPlayer(videoView);--让视频获得焦点videoView.requestFocus();SELECT CONCAT(T.PID||'-',T.PNAME) FROM TEXMPAPER T ;SELECT * FROM THRSINTERVIEW for update;HandlerThread thread = new HandlerThread();thread.getLooper();thread.start();MyDatabaseHelper handler = new MyDatabaseHelper();Message msg = handler.obtainMessage();msg.setData(bundle);msg.sendToTarget();MyDatabaseHelper extents SQLiteOpenHelper{ public MyDatabaseHelper(Looper looper){ super(looper); } public void handleMessage(Message message){ }}handler.post(runnalbe);Runnalbe runnable = new Runnable(){ @Override public void run(){ --do anything you want }};handler.postDelayed(runnable,3000);handler.post(runnable);--post方法使消息队列中的任务得到处理Filter when it is good at it OpenFileInputOpenFileOutput--资源图片转换成Bitmap对象Bitmap bitmap = ((BitmapDrawable)context.getResources().getDrawable(R.id.xxxx)).getBitmap();Bitmap bitmap = BitmapFactory.decodeResource(this.getResources(),R.drawable.xxxImg);final Matrix matrix = new Matrix();matrix.setTranslate();--当前视图获得焦点this.setFocusable(true);--使得matrix对象重置matrix.reset();matrix.setScale(1.0f,1.0f);Bitmap bitmap = Bitmap.createBitmap(bitmap,0,0,width,height,matrix,true);BitmapFactory是一个工具类createBitmap是Bitmap类的静态方法canvas.drawBitmap(bitmap2,matrix,null);handler不会因为处理业务逻辑的时间过长导致UI线程阻塞HandlerThread thread = HandlerThread();Looper looper = thread.getLooper();public class MyHandler extends Handler{ public MyHandler(Looper looper){ super(looper); }}select * from test t for update ; ImageView imageView = (ImageView)findViewById(R.id.xxxImg);--ImageView和Bitmap关联在一起时imageView.setImageBitmap(BitmapFactory.decodeFile(filePath));--通过ImageView获得BitmapBitmapDrawable bitmapDrawable = (BitmapDrawable)imageView.getDrawable();Bitmap bitmapx = bitmapDrawable.getBitmap();--AnimationDrawable逐帧动画 它是由ImageView通过getBackground方法来进行获得AnimationDrawable ad = (AnimationDrawable)imageView.getBackground();ad.start() 或 ad.stop();imageView.setBackgroundResources(R.anim.blast);blast.xml<animation-list><item android:drawable="@drawable/bom_01" android:duration="100"/> <item android:drawable="@drawable/bom_02" android:duration="100"/></animation-list>Intent intent = new Intent();intent.setAction("xxxxx.SecondActivity");action是需要在清单文件 AndroidManifest.xml进行配置的如:<activity android:name=".SecondActivity" android:label="@drawable/secondLabel"><intent-filter> <action android:name="xxxxx.SecondActivity" />一个activity可以设置多个action name <action android:name="LSSDDD.XXXX" /> </intent-filter></activity>startActivity(intent)Intent serviceIntent = new Intent();serviceIntent.setAction("xxxService");<service android:name='xx.xx.xxxService'><intent-filter> <action android:name="xxxService" />为service设置ActionName </intent-filter></service>startService(intent);Service --->IntentServiceint onStartCommand(Intent intent,int flag,int startId) --->void onHandleIntent(Intent intent)select * from thrsinterview for update ;SELECT * FROM thrsemploy FOR UPDATE ;SELECT * FROM thrsemployeval FOR UPDATE ;public class MyService extends Service{ private int count ; private boolean quit = false ; private MyBinder binder = new MyBinder(); public class MyBinder extends Binder{ public int getCount(){ return count ; } } // 必须返回所绑定的对象 @Override public IBinder onBinder(Intent intent){ System.out.println("xxxxxxxx"); return binder ; } @Override public void onCreate(){ super.onCreate(); new Thread(){ @Override public void run(){ while(!quit){ count++; } } }.start(); } @Override public void onDestroy(){ super.onDestroy(); this.quit = true ; }}public class MyBinderService extends Activity{ MyService.MyBinder binder ; final Intent intent = new Intent(); Button button ; intent.setAction("binderService"); @Override public void onCreate(Bundle dxx){ super(dxx); //intent 通过参数来获得要启动的Service // conn 监听访问者与Service之间的连接 // 第三个参数表示绑定时是否自动创建Service BIND_AUTO_CREATE表示自动创建 bindService(intent,conn,Service.BIND_AUTO_CREATE); button = (Button)findViewById('xxxx'); button.setOnClickListener(new OnClickListener(){ @Override public void onClick(View source){ Toast.makeText(this,"service中的值---->"+binder.getCount(),Toast.LENGTH_SHORT).show(); } }); unbindService(conn); } --只要activity和service一连接就获得对应的Binder对象 就可以通过该绑定对象可以获得service运行的值 private ServiceConnection conn = new ServiceConnection(){ @Override public void onServiceConnected(Intent intent ,IBinder bind) { binder = (MyService.MyBinder)bind; } }}MyBinder extends Binder 就可以访问 MyService里面的值 而在Activity中获得Binder对象则需要通过ServiceConntectionServiceConntection connection = new ServiceConntection(){@Override public void onServiceConnected(Intent intent,IBinder service){ binder = (MyService.MyBinder)service ; }}当程序在调用unbindService(conn) 首先会调用onUnBind方法 然后再调用onDestroy方法
更多相关文章
- Android学习笔记之——UI设计
- RecyclerView详解(二):ItemDecoration使用(kotlin)
- unity在android显示界面(UnityPlayerActivity)不重复加载且app退出
- Android(安卓)最火框架XUtils之注解机制详解
- 三种方法使android 手机执行 二进制程序
- Android异常解决--A WebView method was called on thread 'Java
- Android_判断文件是否存在并创建代码
- 浅谈Java中Collections.sort对List排序的两种方法
- Python list sort方法的具体使用