Android开发基础
<h3>Android开发基础</h3><p>开发基础包括</p><h3>① Android开发环境搭建</h3><h4>Android Studio的安装</h4><p>https://developer.android.google.cn/studio/</p><h4>SDK的下载和配置</h4><p>两种方法,</p><p>方法1 拷贝别人的SDK文件夹中的所有内容,放在与AndroidStudio在同级目录方法2 根据Android Studio的向导去下载和安装</p><h4>模拟器的安装与配置</h4><p>方法1 拷贝别人的SDK文件夹中的所有内容,放在与AndroidStudio在同级目录</p><p>方法2 在Android Studio中找到 AVD Manager,根据向导去下载和创建</p><p>方法3 使用第三方的模拟器,也选择android 4.4版本,比如夜神模拟器3.8(不要用最新的)</p><h4>注意事项</h4><p>在下载安装完android studio和sdk之后,创建工程时还会下载gradle工具,用于编译构建</p><p>目录是:C:\Users\自己的用户名.gradle</p><p>如果创建工程还有问题,一般做一个小更新就可以。</p><h3>② Android HelloWorld</h3><p>Android HelloWorld</p><p>工程的创建,工程中每一部分的介绍创建工程界面</p><p><img src="https://img2018.cnblogs.com/blog/1029347/201909/1029347-20190921195947283-191695100.png"></p><p>创建完项目之后,产生的文件</p><p><img src="https://img2018.cnblogs.com/blog/1029347/201909/1029347-20190921195951716-209055258.png"></p><p>清单文件</p><p><img src="https://img2018.cnblogs.com/blog/1029347/201909/1029347-20190921195956920-1553405823.png"></p><h3>③ Android 界面开发知识</h3><h4>无形组件:布局的定义与常用属性设置</h4><p><img src="https://img2018.cnblogs.com/blog/1029347/201909/1029347-20190921200004308-1524687322.png"></p><p><strong>有形组件:按钮、文件控件、编辑文本、图片控件的定义与常用属性设置</strong></p><p>指定ID:android:id="@+id/imageView"</p><p>指定宽度:android:layout_width="wrap_content" android:layout_width="match_parent"</p><p>wrap_content 内容多大控件就多大,match_parent 匹配父窗口</p><p>指定高度:android:layout_height="wrap_content"</p><p>图片控件指定图片源:android:src="@mipmap/ic_launcher" 编辑控件指定提示文本:android:hint="请在此输入密码"</p><p>按钮控件指定显示文本:android:text="验证"</p><p>指定控件居中:android:layout_gravity="center"</p><h4>按钮响应</h4><p>方法一:</p><p>设置按钮属性</p><p><img src="https://img2018.cnblogs.com/blog/1029347/201909/1029347-20190921200010429-1594397429.png"></p><p>添加完响应函数后。</p><p>在函数名上alt+enter实现具体函数内容</p><pre>public void btnStart1(View view) {<br> // 启动一个新的activity<br> // 1. 创建Intent对象<br> Intent intent = new Intent();<br> // 2. 设置信息<br> intent.setClass(this,// 自己<br> Main2Activity.class); // 新启动的类的类型<br> //Main2Activity是新创建的活动界面<br> // 3. 启动activity<br> startActivity(intent);<br><br> //这句包括了三面的3句话的内容<br> //startActivity(new Intent(this,Main2Activity.class));<br><br> }</pre><p>方法二:</p><p>先在manifests的Androidmanifest.xml添加</p><pre><activity android:name=".Main2Activity"><br> <intent-filter><br> <br> <action android:name="com.bluelesson.action.hello15pb" /><br><br> <category android:name="android.intent.category.DEFAULT" /><br> </intent-filter><br> </activity></pre><p>action android:name="com.bluelesson.action.hello15pb" 动作的名字</p><p>category android:name="android.intent.category.DEFAULT" 设置成DEFAULT默认</p><p>然后调用动作。</p><pre> public void btnStart2(View view) {<br><br> // 1. 创建Intent对象<br> Intent intent = new Intent();<br> // 2. 设置动作<br> intent.setAction("com.bluelesson.action.hello15pb");<br> // 3. 启动activity<br> startActivity(intent);<br><br> }</pre><p>打开服务</p><p>关闭服务</p><p>先新建一个服务类</p><p>用log.d做标签做标注方便观察。</p><pre>package com.example.mybuttontest;<br><br>import android.app.Service;<br>import android.content.Intent;<br>import android.os.IBinder;<br>import android.util.Log;<br><br>public class MyService extends Service {<br> public MyService() {<br> }<br><br> @Override<br> public IBinder onBind(Intent intent) {<br> // TODO: Return the communication channel to the service.<br> throw new UnsupportedOperationException("Not yet implemented");<br><br> }<br><br> @Override<br> public void onCreate() {<br> super.onCreate();<br> Log.d("Andy", "onCreate: ");<br> }<br><br> @Override<br> public void onStart(Intent intent, int startId) {<br> super.onStart(intent, startId);<br> Log.d("Andy", "onStart: ");<br> }<br><br> @Override<br> public int onStartCommand(Intent intent, int flags, int startId) {<br><br> Log.d("Andy", "onStartCommand: ");<br> return super.onStartCommand(intent, flags, startId);<br> }<br><br> @Override<br> public void onDestroy() {<br> super.onDestroy();<br> Log.d("Andy", "onDestroy: ");<br> }<br>}</pre><p>再调用它</p><pre><Button<br> android:id="@+id/btn3"<br> android:layout_width="wrap_content"<br> android:layout_height="wrap_content"<br> android:onClick="btnStart3"<br> android:text="启动一个服务" /><br><br> <Button<br> android:id="@+id/btn4"<br> android:layout_width="wrap_content"<br> android:layout_height="wrap_content"<br> android:onClick="btnStart4"<br> android:text="关闭服务" /></pre><h3>代码中设置监听器</h3><p>匿名类直接new接口自动实现接口、内部类实现接口、外部类实现接口</p><p>① 匿名类直接new接口自动实现接口</p><p>在MainActivity的重写oncreate函数内</p><pre> // 设置按钮响应事件<br> // 方法1 : 匿名类对象<br> // 1. 获取按钮对象<br> Button button2 = findViewById(R.id.btn2);<br><br> // 2. 设置监听器<br> button2.setOnClickListener(new View.OnClickListener() {<br> //View.OnClickListener会报红,ALT+ENTER可以快速创建下面内容<br> @Override<br> public void onClick(View v) {<br> Toast toast = Toast.makeText(<br> MainActivity.this,// 只要是Context类型的this就行,activity肯定可以,因为其父类的父类。。。是Context<br> "按钮2",// 显示的内容<br> Toast.LENGTH_SHORT // 显示的时间 LENGTH_SHORT 2秒<br> );<br><br> toast.show();<br> }<br> });<br></pre><p>② 内部类实现接口</p><pre>// 内部类定义<br>public class MyOnClickListener implements View.OnClickListener {<br> @Override<br> public void onClick(View v) {<br> Toast toast = Toast.makeText(MainActivity.this,"按钮3",Toast.LENGTH_SHORT );<br> toast.show();<br> }<br> }<br>// 调用<br> // 获取按钮控件<br> Button button = findViewById(R.id.button);<br> // 设置响应监听器<br> button.setOnClickListener(new MyOnClickListener());</pre><p>③ 外部类实现接口</p><pre>public class MainActivity extends AppCompatActivity implements<br><br>// 方法3: 外部类对象<br> // 1. 获取按钮对象<br> Button button4 = findViewById(R.id.btn4);<br> // 2. 设置监听器<br> button4.setOnClickListener(this);}<br> @Override<br> public void onClick(View v) {<br> Toast toast = Toast.makeText( this,"按钮4",Toast.LENGTH_SHORT);<br> toast.show();}</pre><p>提示对话框Toast、Dialog的创建与使用</p><pre>// 弹出信息,自动消失<br>Toast.makeText(this, // 界面指针<br> "显示", // 显示的内容<br> Toast.LENGTH_SHORT // 显示的时间 LENGTH_SHORT=2秒<br> ).show();<br> // 弹出信息,点击消失<br> AlertDialog.Builder dlg = new AlertDialog.Builder(this);<br> dlg.setMessage("内容");<br> dlg.setTitle("标题");<br> dlg.show();</pre><p><strong>④</strong> <strong>Android</strong> <strong>四大组件</strong></p><p>Activity,BroadcastReceiver,Service,ContenProivder</p><ol><li><p>Activity的生命周期</p></li></ol><p>程序运行起来执行:onCreate》onStart》onResume 当activity被覆盖:onPause》onStop</p><p>当重新显示时:onRestart》onStart》onResume 当关闭时:onPause》onStop》onDestroy</p><ol start="2"><li><p>广播接收者的写法</p></li></ol><h3>IP拨号器</h3><p>创建广播接收者的子类指定拦截广播的权限(manifest.xml里面添加到包的下一句)</p><pre><uses‐permission android:name="android.permission.PROCESS_OUTGOING_CALLS" /></pre><p>指定拦截广播的动作</p><pre><receiver<br> android:name=".MyReceiver"<br> android:enabled="true"<br> android:exported="true"><br> <intent‐filter><br> <action<br>android:name="android.intent.action.NEW_OUTGOING_CALL" /><br> <category<br>android:name="android.intent.category.DEFAULT" /><br> </intent‐filter><br> </receiver><br></pre><p>调用</p><pre>package com.bluelesson.app34_1;<br><br>import android.content.BroadcastReceiver;<br>import android.content.Context;<br>import android.content.Intent;<br><br>// 广播接收器,作用是拦截广播,做一些需要做的事情<br>// 必备条件:<br>// 通过向导新建一个BroadcastReceiver的子类<br>// 1. 指定权限<br>// 2. 指定拦截的是哪个广播<br>// 3. 完成代码<br>public class MyReceiver extends BroadcastReceiver {<br><br> @Override<br> public void onReceive(Context context, Intent intent) {<br> // TODO: This method is called when the BroadcastReceiver is receiving<br> // an Intent broadcast.<br> //IP拨号器 写代码<br> //1. 获取打电话的号码<br> String num = getResultData();<br> // 2. 修改电话号码<br> setResultData("123456"+num);<br> }<br>}</pre><h3>开启启动</h3><p>权限</p><pre><uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /></pre><p>指定拦截广播的动作</p><pre> <receiver<br> android:name=".MyReceiver2"<br> android:enabled="true"<br> android:exported="true"><br> <intent-filter><br> <action android:name="android.intent.action.BOOT_COMPLETED" /><br><br> <category android:name="android.intent.category.DEFAULT" /><br> </intent-filter><br> </receiver></pre><p>调用</p><pre>public class MyReceiver2 extends BroadcastReceiver {<br><br> @Override<br> public void onReceive(Context context, Intent intent) {<br> // TODO: This method is called when the BroadcastReceiver is receiving<br> // an Intent broadcast.<br> Log.d("15pb-log", "开机启动");<br><br> // 启动activity<br> //1. 创建Intent<br> Intent intent1 = new Intent();<br> // 2. 设置信息<br> intent1.setClass(context,Main2Activity.class);<br> intent1.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);// 需要设置标志创建activity栈<br> // 3. 启动acitivity<br> context.startActivity(intent1);<br><br> }<br>}<br></pre><h3>服务的生命周期</h3><p>启动时:onCreate》onStartCommand》onStart 退出时: onDestroy</p><h3>程序入口</h3><pre> <!-- application标签中的android:name 可以指定一个类,这个类主要作用时全局初始化 --><br> <!-- 这个类在安全领域中 主要是 用于写壳代码 --><br> <application<br> android:name=".MyApp"</pre><p>MyApp类</p><pre>package com.bluelesson.app34_2;<br><br>import android.app.Application;<br>import android.content.Context;<br>import android.util.Log;<br><br>public class MyApp extends Application {<br> // http://androidxref.com/<br> @Override<br> protected void attachBaseContext(Context base) {<br> super.attachBaseContext(base);<br> Log.d("15pb-log", "MyApp::attachBaseContext");<br> }<br><br> @Override<br> public void onCreate() {<br> super.onCreate();<br> Log.d("15pb-log", "MyApp::onCreate");<br> }<br>}<br></pre><h3>⑤ Android 多线程与消息机制</h3><p>Thread,Handler</p><p>线程中发消息代码:</p><pre><br>// 创建消息对象<br>Message message = new Message();<br>message.what = 0x111;<br>message.obj = content;<br>// 发消息给主线程<br>handler.sendMessage(message);<br></pre><h3>外部handler创建</h3><h3>网络编程-访问网站-下载图片</h3><p>权限</p><pre><uses-permission android:name="android.permission.INTERNET"></uses-permission></pre><p>消息分发</p><pre>Handler mHandler = new Handler(){<br> @Override<br> public void handleMessage(Message msg) {<br> super.handleMessage(msg);<br> //判断对应的消息ID,获取消息内容,设置信息<br> if(msg.what == SET_TEXT){<br> TextView textView = findViewById(R.id.tv1);<br> textView.setText((String)msg.obj);<br> } else if(msg.what == GET_PIC){<br> ImageView imageView = findViewById(R.id.iv1);<br> imageView.setImageBitmap((Bitmap) msg.obj);<br> }<br><br> }<br> };<br></pre><p>访问网站</p><pre> public void onClick(View view) {<br><br> // 访问网络的一些注意事项<br> // 1. 访问网络需要权限<br> // 2. 访问网络需要在工作线程中操作<br> // 3. 工作线程中不能操作界面,需要发消息给主线程<br><br> // 访问百度<br> Thread thread = new Thread(){<br> @Override<br> public void run() {<br> super.run();<br> URL url = null;<br> try {<br> // 1. 创建url对象<br> url = new URL("http://www.baidu.com");<br> // 2. 打开连接<br> HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();<br> // 3. 设置信息<br> httpURLConnection.setConnectTimeout(2000);<br> httpURLConnection.setRequestMethod("GET");<br> // 4. 获取返回信息<br> // android.os.NetworkOnMainThreadException<br> int ret = httpURLConnection.getResponseCode();<br> if(ret == 200){<br> InputStream inputStream = httpURLConnection.getInputStream();<br> ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();<br> byte bytes[] = new byte;<br> int nReadlen = -1;<br> while(true){<br> nReadlen = inputStream.read(bytes,0,1024);<br> if(nReadlen == -1) break;<br> byteArrayOutputStream.write(bytes,0,nReadlen);<br> }<br><br> byte bytes1[] = byteArrayOutputStream.toByteArray();<br> String s = new String(bytes1);<br><br> Message message = new Message();<br> message.what = SET_TEXT;<br> message.obj = s;<br> mHandler.sendMessage(message);<br><br><br> // 工作线程中不能有界面操作的<br>// TextView textView = MainActivity.this.findViewById(R.id.tv1);<br>// textView.setText(s);<br><br> Log.d("15pb-log", s);<br> }<br> } catch (MalformedURLException e) {<br> e.printStackTrace();<br> } catch (IOException e) {<br> e.printStackTrace();<br> }<br> }<br> };<br> thread.start();<br> }</pre><p>下载图片</p><pre> public void onClick1(View view) {<br><br> Thread thread = new Thread(){<br> @Override<br> public void run() {<br> super.run();<br> URL url = null;<br> try {<br> // 1. 创建url对象<br> url = new URL("http://ws4.sinaimg.cn/large/00745YaMly1g76yel1cf6j30u01904qy.jpg");<br> // 2. 打开连接<br> HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();<br> // 3. 设置信息<br> httpURLConnection.setConnectTimeout(2000);<br> httpURLConnection.setRequestMethod("GET");<br> // 4. 获取返回信息<br> // android.os.NetworkOnMainThreadException<br> int ret = httpURLConnection.getResponseCode();<br> if(ret == 200){<br> InputStream inputStream = httpURLConnection.getInputStream();<br> ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();<br> byte bytes[] = new byte;<br> int nReadlen = -1;<br> while(true){<br> nReadlen = inputStream.read(bytes,0,1024);<br> if(nReadlen == -1) break;<br> byteArrayOutputStream.write(bytes,0,nReadlen);<br> }<br><br> byte bytes1[] = byteArrayOutputStream.toByteArray();<br><br> // 将数据转为图片<br> Bitmap bitmap = BitmapFactory.decodeByteArray(bytes1,0,bytes1.length);<br><br> Message message = new Message();<br> message.what = GET_PIC;<br> message.obj = bitmap;<br> mHandler.sendMessage(message);<br> }<br> } catch (MalformedURLException e) {<br> e.printStackTrace();<br> } catch (IOException e) {<br> e.printStackTrace();<br> }<br> }<br> };<br> thread.start();<br><br> }<br>}</pre><p>网页要滑动屏幕的话,TextView放在activity_main.xml的ScrollView里面就可以</p><pre> <ScrollView<br> android:layout_width="match_parent"<br> android:layout_height="wrap_content"><br> <TextView<br> android:text="显示内容"<br> android:id="@+id/tv1"<br> android:layout_width="match_parent"<br> android:layout_height="wrap_content" /><br><br> </ScrollView><br></pre><p>下载图片。放图片的位置直接用代码就行,注意id最好要重命名。</p><pre><ImageView<br> android:id="@+id/iv1"<br> android:layout_width="match_parent"<br> android:layout_height="wrap_content" /></pre><br><br>来源:https://www.cnblogs.com/ltyandy/p/11564388.html
頁:
[1]