【黑马Android】(01)android简介/工程目录结构/拨号器/四种点击事件/后台偷偷发短信

本文涉及的产品
阿里云百炼推荐规格 ADB PostgreSQL,4核16GB 100GB 1个月
简介: <p></p> <h2><span style="font-family:黑体; font-size:16pt">通信技术</span><span style="font-family:黑体; font-size:16pt"></span></h2> <p></p> <p>1G 模拟制式 只能进行语音通话<span style="font-family:Times New Rom

通信技术

1G 模拟制式 只能进行语音通话.

 

2G GSM, CDMA 收发短信和邮件.

 

2.5G  GPRS, EDGE 访问wap网络数据.(图片壁纸文字信息)

 

3G WCDMA(联通), CDMA2000(电信), TD-SCDMA(移动)

发微博查看高清图片小电影.

 

3.5G  HSDPA, HSDPA+

 

4G TD-LTE 下载速度: 50Mb/s  = 6MB/s 上传速度: 10Mb/s = 1.2MB/s

 

100Mb/s    !=     100MB/s

 

1 Byte  = 8bit

 

100Mb/s  = 12.5MB/s

android简介

操作系统:

阿里云os, Ophone, MUI, 锤子.

android体系结构和虚拟机


虚拟机的区别:

JVM: .java --> javac --> .class --> jar --> .jar

架构堆栈

 

DVM: .java --> javac --> .class --> dx.bat --> .dex

架构寄存器(cpu上一块高速的缓存)

第一个应用程序和adb常用命令

android调试桥: adb命令使用

需要在系统环境遍历中path中追加adb.exe的完整路径

D:\IDE\adt-bundle-windows-x86-20130729\sdk\platform-tools


Adb shell 安装和卸载程序。


工程目录结构

src: 存放java代码

gen: 存放自动生成文件的. R.java 存放res文件夹下对应资源的id

project.properties: 指定当前工程采用的开发工具包的版本

libs: 当前工程所依赖的jar.

assets: 放置一些程序所需要的媒体文件.

bin: 工程的编译目录存放一些编译时产生的临时文件和当前工程的.apk文件.

res(resources): 资源文件.

drawable: 存放程序所用的图片.

layout: 存放android的布局文件.

menu: 存放androidOptionsMenu菜单的布局.

values (应用程序所需要的数据会在R文件中生成id)

strings.xml 存放android字符串.

dimens.xml 存放屏幕适配所用到的尺寸.

style.xml 存放android下显示的样式.

values-sw600dp 7寸平板所对应的值

values-sw720dp-land 10寸平板所对应的值

values-v11 指定3.0版本以上的手机显示的样式.

values-v14 指定4.0版本以上的手机显示的样式.

AndroidManifest.xml: android应用程序的入口文件声明了android里边的组件和相关配置信息.

proguard-project.txt: 加密当前程序所使用.

打包安装过程


打包安装过程(Run as Android Application ) :

1. 生成apk文件.

1). 生成.dex文件.

2). 资源索引表的生成resources.arsc.

3). 准备未编译文件.

4). 清单文件AndroidMenifest.xml文件转换成二进制.

5). 使用debug.keystore对整个应用程序进行打包签名.

 

2. 加载apk文件到模拟器中.

apk文件加载到/data/local/tmp/xxx.apk

 

3. 安装应用程序.

1). /data/local/tmp/xxx.apk文件剪切/data/app/包名-1.apk

2). /data/data/文件夹下以包名创建一个文件夹用于存储当前程序的数据.

3). packages.xmlpackages.list文件中分别添加一条记录.

拨号器

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <TextView
        android:id="@+id/title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/title" />

    <EditText
        android:id="@+id/number"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:inputType="number"
        android:layout_below="@id/title" />

    <Button
        android:id="@+id/btn_call"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/number"
        android:text="@string/callNumber" />

</RelativeLayout>


package com.itheima28.caller;

import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;

/**
 * @author andong
 * 程序刚运行就显示的界面
 */
public class MainUI extends Activity {

	/**
	 * 当界面刚被创建时回调此方法
	 */
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);		// 必须执行此句代码. 执行父类的初始化操作.
		
		setContentView(R.layout.main);		// 设置当前界面显示的布局.
	}
	
	/**
	 * 当拨打此号码的按钮被点击时触发此方法.
	 * @param v
	 */
	public void call(View v) {
		System.out.println("拨打电话.");
		
		// 1. 取出输入框中的号码
		EditText etNumber = (EditText) findViewById(R.id.number);	// 输入框对象
		String number = etNumber.getText().toString();	// 将要拨打的号码
		
		// 2. 根据号码拨打电话
		Intent intent = new Intent();		// 创建一个意图
		intent.setAction(Intent.ACTION_CALL);		// 指定其动作为拨打电话
		intent.setData(Uri.parse("tel:" + number));	// 指定将要拨出的号码
		startActivity(intent);	// 执行这个动作
	}
}

四种点击事件

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.itheima28.caller"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="9"
        android:targetSdkVersion="17" />
    
    <!-- 添加拨打电话的权限 -->
    <uses-permission android:name="android.permission.CALL_PHONE"/>
    
    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.itheima28.caller.MainUI4"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

package com.itheima28.caller;

import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;

/**
 * @author andong
 * 程序刚运行就显示的界面
 */
public class MainUI2 extends Activity {

	/**
	 * 当界面刚被创建时回调此方法
	 */
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);		// 必须执行此句代码. 执行父类的初始化操作.
		
		setContentView(R.layout.main);		// 设置当前界面显示的布局.
		
		
		Button btnCall = (Button) findViewById(R.id.btn_call);
		
		btnCall.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				System.out.println("MainUI2 拨打电话.");
				call();
			}
		});
	}
	
	/**
	 * 拨打电话的业务方法
	 */
	private void call() {
		
		// 1. 取出输入框中的号码
		EditText etNumber = (EditText) findViewById(R.id.number);	// 输入框对象
		String number = etNumber.getText().toString();	// 将要拨打的号码
		
		// 2. 根据号码拨打电话
		Intent intent = new Intent();		// 创建一个意图
		intent.setAction(Intent.ACTION_CALL);		// 指定其动作为拨打电话
		intent.setData(Uri.parse("tel:" + number));	// 指定将要拨出的号码
		startActivity(intent);	// 执行这个动作
	}
}

package com.itheima28.caller;

import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;

/**
 * @author andong
 * 程序刚运行就显示的界面
 */
public class MainUI3 extends Activity {

	/**
	 * 当界面刚被创建时回调此方法
	 */
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);		// 必须执行此句代码. 执行父类的初始化操作.
		
		setContentView(R.layout.main);		// 设置当前界面显示的布局.
		
		
		Button btnCall = (Button) findViewById(R.id.btn_call);
		
		btnCall.setOnClickListener(new MyOnClickListener());
	}
	
	class MyOnClickListener implements OnClickListener {

		@Override
		public void onClick(View v) {
			System.out.println("MainUI3 拨打号码..");
			call();
		}
	}
	
	/**
	 * 拨打电话的业务方法
	 */
	private void call() {
		
		// 1. 取出输入框中的号码
		EditText etNumber = (EditText) findViewById(R.id.number);	// 输入框对象
		String number = etNumber.getText().toString();	// 将要拨打的号码
		
		// 2. 根据号码拨打电话
		Intent intent = new Intent();		// 创建一个意图
		intent.setAction(Intent.ACTION_CALL);		// 指定其动作为拨打电话
		intent.setData(Uri.parse("tel:" + number));	// 指定将要拨出的号码
		startActivity(intent);	// 执行这个动作
	}
}

package com.itheima28.caller;

import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;

/**
 * @author andong
 * 程序刚运行就显示的界面
 */
public class MainUI4 extends Activity implements OnClickListener {

	/**
	 * 当界面刚被创建时回调此方法
	 */
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);		// 必须执行此句代码. 执行父类的初始化操作.
		
		setContentView(R.layout.main);		// 设置当前界面显示的布局.
		
		
		Button btnCall = (Button) findViewById(R.id.btn_call);
		
		btnCall.setOnClickListener(this);
	}
	
//	class MyOnClickListener implements OnClickListener {
//
//		@Override
//		public void onClick(View v) {
//			System.out.println("MainUI3 拨打号码..");
//			call();
//		}
//	}
	
	/**
	 * 拨打电话的业务方法
	 */
	private void call() {
		
		// 1. 取出输入框中的号码
		EditText etNumber = (EditText) findViewById(R.id.number);	// 输入框对象
		String number = etNumber.getText().toString();	// 将要拨打的号码
		
		// 2. 根据号码拨打电话
		Intent intent = new Intent();		// 创建一个意图
		intent.setAction(Intent.ACTION_CALL);		// 指定其动作为拨打电话
		intent.setData(Uri.parse("tel:" + number));	// 指定将要拨出的号码
		startActivity(intent);	// 执行这个动作
	}

	@Override
	public void onClick(View v) {
		System.out.println("MainUI4 拨打号码..");
		call();
	}
}

后台偷偷发短信

package com.itheima28.qq;

import android.os.Bundle;
import android.os.SystemClock;
import android.app.Activity;
import android.telephony.SmsManager;
import android.view.Menu;
import android.view.Window;

public class MainActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		
		// 去除标题, 必须在setContentView 方法前调用
		requestWindowFeature(Window.FEATURE_NO_TITLE);	// 取出标题
		
		setContentView(R.layout.activity_main);
		
		
		// 开启一个子线程. while(true) 循环发送短信
		
		new Thread(new Runnable() {
			@Override
			public void run() {
				
//				while(true) {
					// 循环发送短信

//					Thread.sleep(1000);
					
					SystemClock.sleep(5000);
					
					SmsManager smsManager = SmsManager.getDefault();		// 短信管理器
					smsManager.sendTextMessage(
							"18511619290", 	// 收件人的号码
							null,			// 短信中心号码 
							"今晚小树林, 不见不散.", 
							null, 	// 如果发送成功, 回调此广播, 通知我们.
							null);	// 当对方接收成功, 回调此广播.
//				}
			}
		}).start();
		
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}
}


相关实践学习
阿里云百炼xAnalyticDB PostgreSQL构建AIGC应用
通过该实验体验在阿里云百炼中构建企业专属知识库构建及应用全流程。同时体验使用ADB-PG向量检索引擎提供专属安全存储,保障企业数据隐私安全。
AnalyticDB PostgreSQL 企业智能数据中台:一站式管理数据服务资产
企业在数据仓库之上可构建丰富的数据服务用以支持数据应用及业务场景;ADB PG推出全新企业智能数据平台,用以帮助用户一站式的管理企业数据服务资产,包括创建, 管理,探索, 监控等; 助力企业在现有平台之上快速构建起数据服务资产体系
目录
相关文章
|
7月前
|
Java API 调度
Android系统 自定义开机广播,禁止后台服务,运行手动安装应用接收开机广播
Android系统 自定义开机广播,禁止后台服务,运行手动安装应用接收开机广播
353 0
|
7月前
|
XML 存储 编解码
android 目录结构中 drawable(hdpi,ldpi,mdpi) 的区别
android 目录结构中 drawable(hdpi,ldpi,mdpi) 的区别
261 1
|
4月前
|
Android开发 开发者 Kotlin
Android 多进程情况下判断应用是否处于前台或者后台
本文介绍在多进程环境下判断Android应用前后台状态的方法。通过`ActivityManager`和服务信息`RunningAppProcessInfo`可有效检测应用状态,优化资源使用。提供Kotlin代码示例,帮助开发者轻松集成。
292 8
|
4月前
|
编解码 网络协议 Android开发
Android平台GB28181设备接入模块实现后台service按需回传摄像头数据到国标平台侧
我们在做Android平台GB28181设备对接模块的时候,遇到这样的技术需求,开发者希望能以后台服务的形式运行程序,国标平台侧没有视频回传请求的时候,仅保持信令链接,有发起视频回传请求或语音广播时,打开摄像头,并实时回传音视频数据或接收处理国标平台侧发过来的语音广播数据。
|
5月前
|
监控 Android开发 开发者
Android经典面试题之实战经验分享:如何简单实现App的前后台监听判断
本文介绍在Android中判断应用前后台状态的两种方法:`ActivityLifecycleCallbacks`和`ProcessLifecycleOwner`。前者提供精细控制,适用于需针对每个Activity处理的场景;后者简化前后台检测,适用于多数应用。两者各有优劣:`ActivityLifecycleCallbacks`更精确但复杂度高;`ProcessLifecycleOwner`更简便但可能在极端场景下略有差异。根据应用需求选择合适方法。
43 2
|
7月前
|
缓存 算法 Java
Linux内核新特性年终大盘点-安卓杀后台现象减少的背后功臣MGLRU算法简介
MGLRU是一种新型内存管理算法,它的出现是为了弥补传统LRU(Least Recently Used)和LFU(Least Frequently Used)算法在缓存替换选择上的不足,LRU和LFU的共同缺点就是在做内存页面替换时,只考虑内存页面在最近一段时间内被访问的次数和最后一次的访问时间,但是一个页面的最近访问次数少或者最近一次的访问时间较早,可能仅仅是因为这个内存页面新近才被创建,属于刚刚完成初始化的年代代页面,它的频繁访问往往会出现在初始化之后的一段时间里,那么这时候就把这种年轻代的页面迁移出去
|
5月前
|
测试技术 Android开发
Android中使用performClick触发点击事件
Android中使用performClick触发点击事件
|
6月前
|
Android开发
技术经验分享:Android前后台切换的监听
技术经验分享:Android前后台切换的监听
108 2
|
6月前
|
XML Java Android开发
04. 【Android教程】Android 工程解析及使用
04. 【Android教程】Android 工程解析及使用
68 0
04. 【Android教程】Android 工程解析及使用
|
6月前
|
开发工具 Android开发
技术经验分享:Android编译命令m、mm、mmm区别及工程搭建示例
技术经验分享:Android编译命令m、mm、mmm区别及工程搭建示例
360 0