Android基础总结(三)
来源:互联网 发布:基于python的量化投资 编辑:程序博客网 时间:2024/05/21 07:04
13. 通知
13.1. 吐司通知
Ÿ 创建通知
Toast.makeText(Context context, CharSequence text, int duration)
Toast.makeText(Context context, int resId, int duration)
Ÿ 发送通知
show()
13.2. 状态栏通知
Ÿ 获取系统通知服务
NotificationManager nm = (NotificationManager) getSystemService(NOTIFICATION_SERVICE)
Ÿ 创建通知
通过构造函数创建: Notification(int icon, CharSequence tickerText, long when)
icon: 通知的图片资源ID
tickerText: 状态栏中显示的消息内容
when: 时间
Ÿ 创建PendingIntent以供点击时发送
PendingIntent.getActivity(Context context, int requestCode, Intent intent, int flags)
context: 当前上下文
requestCode: 请求码
intent: 点击时要发送的意图
flags: 类型, PendingIntent中提供了常量选择
Ÿ 设置通知点击事件
调用Notification 对象方法: setLatestEventInfo(Context context, CharSequence contentTitle, CharSequence contentText, PendingIntent contentIntent)
context: 当前上下文
contentTitle: 标题
contentText: 内容
contentIntent: 点击时触发的意图
Ÿ 设置通知点击后清除
设置Notification 对象属性 n.flags = Notification.FLAG_AUTO_CANCEL;
Ÿ 发送消息
调用Notification对象方法: notify(int id, Notification notification)
13.3. 对话框通知
Ø 普通对话框
new AlertDialog.Builder(this) //
.setTitle("普通对话框") //
.setMessage("普通内容") //
.setCancelable(false) //
.setPositiveButton("YES", listener) // listener 为OnClickListener 监听器对象, 监听按钮被选中
.setNeutralButton("CANCEL", listener) //
.setNegativeButton("NO", listener) //
.show();
Ø 列表对话框
new AlertDialog.Builder(this) //
.setTitle("列表对话框") //
.setCancelable(false) //
.setItems(items, listener) // listener 为OnClickListener 监听器对象, 监听列表项被选中
.show();
Ø 单选对话框
new AlertDialog.Builder(this) //
.setTitle("单选对话框") //
.setCancelable(false) //
.setSingleChoiceItems(items, 0, choiceLinstener) // 0, 为默认选中索引, choiceLinstener 为 OnClickListener 监听器对象, 监听单选按钮被选中
.setPositiveButton("确定", positiveLinstener) // positiveLinstener 为 OnClickListener 监听器对象, 监听确定按钮点击
.show();
Ø 多选对话框
new AlertDialog.Builder(this) //
.setTitle("多选对话框") //
.setCancelable(false) //
.setMultiChoiceItems(items, checkedArr, choiceListener) // checkedArr 为默认选中, choiceListener 为 OnMultiChoiceClickListener 监听器对象, 监听多选按钮被选中
.setPositiveButton("确定", positiveLinstener) // positiveLinstener 为 OnClickListener 监听器对象, 监听确定按钮点击
.show();
Ø 进度对话框
ProgressDialog dialog = new ProgressDialog(this);
dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); // 设置进度条样式
dialog.setTitle("下载中");
dialog.setMessage("请稍候...");
dialog.setCancelable(false);
dialog.setMax(100);
dialog.show();
dialog.setProgress(10); // 设置进度
dialog.dismiss(); // 对话框结束
关于通知的文档位置:android-sdk-windows/docs/guide/topics/ui/notifiers/index.html
14. 常用UI
14.1. 列表视图(ListView)
Ø XML配置
Ÿ 在主界面中配置<ListView>标签
Ÿ 在res/layout/文件夹下创建一个新的xml文件指定每个条目的布局
Ø Java代码构建ListView
Ÿ 获取ListView对象
Ÿ 设置一个Adapter
BaseAdapter:实现内部抽象方法
SimpleAdapter:以List<Map<String, ?>>形式封装数据
SimpleCursorAdapter:以Cursor对象封装数据,Cursor中需要有“_id”一列
Ÿ 添加OnItemClickListener
调用ListView的getItemAtPosition(int)方法可以获取封装数据的容器
如果传入的是BaseAdapter,获取到的就是我们自定义方法中返回的内容
如果传入的是SimpleAdapter,获取到的就是一个Map<String, ?>
如果传入的是SimpleCursorAdapter,获得到的就是一个Cursor,并且Cursor以指向选中的一条记录
14.2. 单选(RadioGroup)
Ÿ 定义<RadioGroup>
Ÿ 在<RadioGroup>中定义<RadioButton>和<Button>
Ÿ 处理Button的点击事件
Ÿ 根据ID获取RadioGroup对象,调用其getCheckedRadioButtonId()方法可以获取其中被选中的RadioGroup的ID
Ø 代码
<RadioGroup
android:id="@+id/lessonsRG"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<RadioButton
android:id="@+id/javaRB"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Java" />
<RadioButton
android:id="@+id/netRB"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text=".Net" />
<RadioButton
android:id="@+id/phpRB"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="PHP" />
<Button
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:onClick="onRradioClick"
android:text="确定" />
</RadioGroup>
public void onRradioClick(View view) {
RadioGroup lessonRG = (RadioGroup) findViewById(R.id.lessonsRG);
int id = lessonRG.getCheckedRadioButtonId(); // 获取选中的id
String msg = null;
switch (id) {
case R.id.javaRB:
msg = "Java";
break;
case R.id.netRB:
msg = ".Net";
break;
case R.id.phpRB:
msg = "PHP";
break;
}
Toast.makeText(this, msg, 0).show();
}
14.3. 多选(CheckBox)
Ÿ 定义若干<CheckBox>和一个<Button>
Ÿ 处理Button的点击事件
Ÿ 根据ID获取每个CheckBox,调用其isChecked()方法判断是否被选中
Ø 代码
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content" >
<CheckBox
android:id="@+id/javaCB"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Java" />
<CheckBox
android:id="@+id/netCB"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text=".Net" />
<CheckBox
android:id="@+id/phpCB"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="PHP" />
<Button
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:onClick="checkboxOnClick"
android:text="确定" />
</LinearLayout>
public void checkboxOnClick(View view) {
CheckBox javaCB = (CheckBox) findViewById(R.id.javaCB);
CheckBox netCB = (CheckBox) findViewById(R.id.netCB);
CheckBox phpCB = (CheckBox) findViewById(R.id.phpCB);
StringBuilder sb = new StringBuilder();
sb.append(javaCB.isChecked() ? javaCB.getText() + " " : "");
sb.append(netCB.isChecked() ? netCB.getText() + " " : "");
sb.append(phpCB.isChecked() ? phpCB.getText() + " " : "");
Toast.makeText(this, sb, 0).show();
}
14.4. 下拉列表(Spinner)
Ÿ 定义<Spinner>标签
Ÿ 创建一个适配器
Ÿ 获取Spinner标签,调用setAdapter(SpinnerAdapter adapter)方法设置一个适配器
Ÿ 调用setOnItemSelectedListener(OnItemSelectedListener listener)方法设置监听器监听选中事件
Ø XML配置
<Spinner
android:id="@+id/spinner"
android:layout_width="fill_parent"
android:layout_height="wrap_content" />
Ø 使用字符串构建适配器
private void setSpinnerByString() {
final Spinner spinner = (Spinner) findViewById(R.id.spinner);
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item); // 设置样式
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); // 设置下拉后样式
adapter.add("Java");
adapter.add(".Net");
adapter.add("PHP");
spinner.setAdapter(adapter);
spinner.setOnItemSelectedListener(new OnItemSelectedListener() {
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
String selection = (String) spinner.getItemAtPosition(position);
Toast.makeText(getApplicationContext(), selection, 0).show();
}
public void onNothingSelected(AdapterView<?> parent) {
}
});
}
Ø 使用JavaBean构建适配器
private void setSpinnerByJavaBean() {
final Spinner spinner = (Spinner) findViewById(R.id.spinner);
ArrayAdapter<User> adapter = new ArrayAdapter<User>(this, android.R.layout.simple_spinner_item);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
adapter.add(new User(1, "lhm", "lhm@itcast.cn"));
adapter.add(new User(2, "yzk", "yzk@itcast.cn"));
adapter.add(new User(3, "hsp", "hsp@itcast.cn"));
spinner.setAdapter(adapter);
spinner.setOnItemSelectedListener(new OnItemSelectedListener() {
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
User selection = (User) spinner.getItemAtPosition(position);
Toast.makeText(getApplicationContext(), selection.getName(), 0).show();
}
public void onNothingSelected(AdapterView<?> parent) {
}
});
}
Ø 使用资源文件构建适配器
<string-array name="items">
<item>Java</item>
<item>.Net</item>
<item>PHP</item>
</string-array>
private void setSpinnerByResource() {
final Spinner spinner = (Spinner) findViewById(R.id.spinner);
ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this, R.array.items, android.R.layout.simple_spinner_item);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner.setAdapter(adapter);
spinner.setOnItemSelectedListener(new OnItemSelectedListener() {
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
CharSequence selection = (CharSequence) spinner.getItemAtPosition(position);
Toast.makeText(getApplicationContext(), selection, 0).show();
}
public void onNothingSelected(AdapterView<?> parent) {
}
});
}
Ø 自定义适配器样式
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal" >
<ImageView
android:layout_width="50dp"
android:layout_height="50dp"
android:src="@android:drawable/ic_delete" />
<TextView
android:id="@+id/content"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textSize="50sp" />
</LinearLayout>
private void setSpinnerByCustom() {
final Spinner spinner = (Spinner) findViewById(R.id.spinner);
ArrayAdapter<CharSequence> adapter = new ArrayAdapter<CharSequence>(this, R.layout.item, R.id.content);
adapter.add("Java");
adapter.add(".Net");
adapter.add("PHP");
spinner.setAdapter(adapter);
spinner.setOnItemSelectedListener(new OnItemSelectedListener() {
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
String selection = (String) spinner.getItemAtPosition(position);
Toast.makeText(getApplicationContext(), selection, 0).show();
}
public void onNothingSelected(AdapterView<?> parent) {
}
});
}
14.5. 菜单(Menu)
Ø 添加菜单项
Ÿ 重写Actvity的onCreateOptionsMenu(Menu menu)方法
Ÿ 添加菜单项
调用方法中参数menu的add(CharSequence title) 方法
Ÿ 添加子菜单
调用menu对象的addSubMenu(final CharSequence title)
该方法返回一个SubMenu对象
Ÿ 添加子菜单的菜单项
调用SubMenu对象的add(CharSequence title) 方法
Ø 处理菜单点击事件
Ÿ 重写Activity的onOptionsItemSelected(MenuItem item) 方法
参数item即为被选中的菜单项
Ø 代码
public boolean onCreateOptionsMenu(Menu menu) {
menu.add("增加");
menu.add("修改");
menu.add("删除");
SubMenu subMenu = menu.addSubMenu("查询");
subMenu.add("按照序号查询");
subMenu.add("按照姓名查询");
subMenu.add("按照邮箱查询");
return super.onCreateOptionsMenu(menu);
}
public boolean onOptionsItemSelected(MenuItem item) {
Toast.makeText(this, item.getTitle(), 0).show();
return super.onOptionsItemSelected(item);
}
14.6. 内容提示文本框(AutoCompleteTextView)
Ø 单次提示
Ø 代码
<AutoCompleteTextView
android:id="@+id/actv"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:completionThreshold="1" />
private void setAutoCompleteTextView() {
AutoCompleteTextView actv = (AutoCompleteTextView) findViewById(R.id.actv);
String[] items = { "tom", "tony", "terry", "张孝祥", "张海军", "张泽华" };
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_dropdown_item_1line, items);
actv.setAdapter(adapter);
}
Ø 多次提示
Ø 代码
<MultiAutoCompleteTextView
android:id="@+id/mactv"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:completionThreshold="1" />
private void setMultiAutoCompleteTextView() {
MultiAutoCompleteTextView mactv = (MultiAutoCompleteTextView) findViewById(R.id.mactv);
String[] items = { "tom", "tony", "terry", "张孝祥", "张海军", "张泽华" };
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_dropdown_item_1line, items);
mactv.setAdapter(adapter);
mactv.setTokenizer(new MultiAutoCompleteTextView.CommaTokenizer());
}
14.7. 手势识别(GestureOverlayView)
Ø 创建手势库
Ÿ 导入SDK中的工程
android-sdk-windows\samples\android-8\GestureBuilder
这个工程不能直接导入,需要添加三个配置文件:.classpath、.project、default.properties
Ÿ 将工程部署到手机中,创建手势库
手势库会存储在手机SD卡的根目录,文件名为:gestures
Ø 代码
将gestures放入res/raw文件夹下
<android.gesture.GestureOverlayView
android:id="@+id/gov"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gestureStrokeType="multiple" />
GestureOverlayView gov = (GestureOverlayView) findViewById(R.id.gov);
final GestureLibrary library = GestureLibraries.fromRawResource(this, R.raw.gestures);
library.load();
gov.addOnGesturePerformedListener(new OnGesturePerformedListener() {
public void onGesturePerformed(GestureOverlayView overlay, Gesture gesture) {
ArrayList<Prediction> list = library.recognize(gesture);
for (Prediction p : list)
System.out.println(p.name + ": " + p.score);
}
});
14.8. 网页视图(WebView)
Ø 代码
<WebView
android:id="@+id/webView"
android:layout_width="fill_parent"
android:layout_height="fill_parent" />
WebView webView = (WebView) findViewById(R.id.webView);
webView.getSettings().setBuiltInZoomControls(true); // 放大缩小按钮
webView.getSettings().setJavaScriptEnabled(true); // JS允许
webView.setWebChromeClient(new WebChromeClient()); // Chrome内核
webView.loadUrl("http://192.168.1.100:8080");
15. 样式与主题
15.1. 样式
Ø 定义样式
Ÿ 设置样式,在values文件夹下的任意文件中的<resources>中配置<style>标签
<style name="style1">
<item name="android:layout_width">fill_parent</item>
<item name="android:layout_height">wrap_content</item>
</style>
Ÿ 继承样式,在<style>标签中配置属性parent
<style name="style2" parent="@style/style1">
<item name="android:textColor">#FF0000</item>
</style>
Ÿ 继承样式,在name中引用其他样式
<style name="style2.style3">
<item name="android:textSize">30sp</item>
</style>
Ø 使用样式
Ÿ 在layout文件的标签中配置style属性
<Button
style="@style/style2.style3"
android:text="这是一个按钮"
/>
15.2. 主题
Ÿ 定义过的样式也可以应用在<activity>和<application>标签中,使用theme属性尽心配置
<style name="theme">
<item name="android:windowNoTitle">true</item>
<item name="android:windowFullscreen">?android:windowNoTitle</item>
</style>
<activity android:name=".MainActivity"
android:label="@string/app_name"
android:theme="@style/theme"
>
Ÿ ? 表示引用其他属性的值
Ÿ @ 表示访问资源文件
Ÿ 如果使用android内置的样式,IDE自动提示的“_”要替换成“.”
16. 国际化与屏幕适配
16.1. 国际化
Ÿ 在values和drawable文件夹后加上语言以及地区名,程序中需要国际化的部分使用资源ID
values-en-rUK
values-en-rUS
values-zh-rCN
values-zh-rTW
Ÿ 匹配规则
在匹配资源时先会找语言、地区完全匹配的
如果没有地区匹配的,则查找语言匹配的
如果没有语言匹配的则找默认values
16.2. 屏幕适配
Ÿ 在layout文件夹后加上分辨率,系统会根据屏幕尺寸自动选择
注意分辨率中的乘号是“x”不是“*”
Ÿ 如果没有匹配的分辨率会找默认layout文件夹
17. 动画特效
17.1. Frame
Ÿ 通过多个画面连续播放实现动画效果
Ÿ 详见文档 android-sdk-windows/docs/guide/topics/resources/animation-resource.html
17.2. Tween
Ÿ 将某个组件以渐变的方式实现透明、缩放、移动、旋转等动画效果
Ÿ 详见文档 android-sdk-windows/docs/guide/topics/resources/animation-resource.html
17.3. 使用动画切换Activity
Ÿ 在startActivity()方法调用之后调用overridePendingTransition(int enterAnim, int exitAnim)方法
enterAnim 进入的动画资源id
exitAnim 退出的动画 资源id
17.4. 使用动画翻页
Ÿ XML配置
<ViewFlipper
android:id="@+id/viewFlipper"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/bb2"
/>
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/bb3"
/>
</ViewFlipper>
Ÿ Java代码
public boolean onTouchEvent(MotionEvent event) {
ViewFlipper viewFlipper = (ViewFlipper) findViewById(R.id.viewFlipper);
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
start = event.getX();
break;
case MotionEvent.ACTION_UP:
float end = event.getX();
if (end > start) {
viewFlipper.setInAnimation(this, R.anim.previous_enter);
viewFlipper.setOutAnimation(this, R.anim.previous_exit);
viewFlipper.showPrevious();
} else if (end < start) {
viewFlipper.setInAnimation(this, R.anim.next_enter);
viewFlipper.setOutAnimation(this, R.anim.next_exit);
viewFlipper.showNext();
}
break;
}
return super.onTouchEvent(event);
}
18. 其他
18.1. 传感器
Ø 传感器参数
Ÿ 传感器类型
方向 Sensor.TYPE_ORIENTATION
加速 Sensor.TYPE_ACCELEROMETER
光线 Sensor.TYPE_LIGHT
磁场 Sensor.TYPE_MAGNETIC_FIELD
距离 Sensor.TYPE_PROXIMITY
温度 Sensor.TYPE_TEMPERATURE
Ÿ 传感器反应速度
SensorManager.SENSOR_DELAY_FASTEST
SensorManager.SENSOR_DELAY_GAME
SensorManager.SENSOR_DELAY_UI
SensorManager.SENSOR_DELAY_NORMAL
Ø 使用方向传感器
Ÿ 获得传感器管理器
SensorManager manager = (SensorManager) getSystemService(SENSOR_SERVICE);
Ÿ 获得方向传感器
Sensor sensor = manager.getDefaultSensor(Sensor.TYPE_ORIENTATION);
Ÿ 注册监听器
manager.registerListener(listener, sensor, SensorManager.SENSOR_DELAY_NORMAL);
Ÿ 监听器
private final class MySensorEventListener implements SensorEventListener {
public void onSensorChanged(SensorEvent event) {
System.out.println(event.values[0]);
}
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
}
Ÿ 取消监听器
manager.unregisterListener(listener, sensor);
18.2. 触摸事件
Ø 拖拽
Ÿ XML配置
<ImageView
android:id="@+id/image"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:scaleType="matrix"
android:src="@drawable/image" />
Ÿ Java代码
ImageView imageView = (ImageView) findViewById(R.id.image);
imageView.setOnTouchListener(new MyOnTouchListener());
private class MyOnTouchListener implements OnTouchListener {
private float x;
private float y;
private Matrix currentMatrix = new Matrix(); // 用来操作图片的矩阵
private Matrix oldMatrix = new Matrix();
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN: // 按下时
x = event.getX(); // 获取x轴坐标
y = event.getY(); // 获取y轴坐标
oldMatrix.set(imageView.getImageMatrix()); // 记住位置
break;
case MotionEvent.ACTION_MOVE: // 移动时
currentMatrix.set(oldMatrix); // 设置成按下时记住的位置
currentMatrix.postTranslate(event.getX() - x, event.getY() - y); // 改变位置
break;
}
imageView.setImageMatrix(currentMatrix); // 移动图片
return true;
}
}
Ø 多点触摸
private class MyOnTouchListener implements OnTouchListener {
private float x; // 图片移动前的x轴坐标
private float y; // 图片移动前的y轴坐标
private Matrix currentMatrix = new Matrix(); // 用来移动图片的矩阵
private Matrix oldMatrix = new Matrix(); // 图片移动前的矩阵
private int type; // 操作类型, 一根手指触摸还是两根手指触摸
private float start; // 第二根手指按下时的距离
private float end; // 两根手指移动后的距离
private PointF point; // 放大时的中心点
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction() & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_DOWN:
type = 1;
x = event.getX();
y = event.getY();
oldMatrix.set(imageView.getImageMatrix());
break;
case MotionEvent.ACTION_MOVE:
currentMatrix.set(oldMatrix);
if (type == 1) { // 1根手指触摸
currentMatrix.postTranslate(event.getX() - x, event.getY() - y);
} else { // 2跟手指触摸
end = countDistance(event); // 计算结束时距离
float scale = end / start; // 计算缩放比例
currentMatrix.postScale(scale, scale, point.x, point.y); // 设置缩放
}
break;
case MotionEvent.ACTION_POINTER_DOWN:
type = 2;
start = countDistance(event); // 计算开始时距离
point = countPoint(event); // 计算中心点
oldMatrix.set(imageView.getImageMatrix());
break;
}
imageView.setImageMatrix(currentMatrix); // 改变图片
return true;
}
}
public float countDistance(MotionEvent event) {
float a = event.getX(1) - event.getX(0); // x轴距离
float b = event.getY(1) - event.getY(0); // y轴距离
return (float) Math.sqrt(a * a + b * b); // 勾股定理
}
public PointF countPoint(MotionEvent event) {
float x = (event.getX(0) + event.getX(1)) / 2; // x轴中间点
float y = (event.getY(0) + event.getY(1)) / 2; // y轴中间点
return new PointF(x, y);
}
18.3. 读取SIM卡
Ø 电话号码、运营商信息
Ÿ 需要权限
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
Ÿ Java代码
TelephonyManager manager = (TelephonyManager) getContext().getSystemService(Context.TELEPHONY_SERVICE);
System.out.println("电话号码: " + manager.getLine1Number());
System.out.println("运营商编号: " + manager.getNetworkOperator());
System.out.println("运营商名字: " + manager.getNetworkOperatorName());
Ø 联系人
Ÿ 需要权限
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.WRITE_CONTACTS" />
Ÿ Java代码
Uri uri = Uri.parse("content://icc/adn");
Cursor c = getContentResolver().query(uri, null, null, null, null);
while (c.moveToNext())
System.out.println(c.getString(c.getColumnIndex("name")) + ": " + c.getString(c.getColumnIndex("number")));
Ø 通话记录
Ÿ 需要权限
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.WRITE_CONTACTS" />
Ÿ Java代码
Uri uri = CallLog.Calls.CONTENT_URI;
Cursor c = getContentResolver().query(uri, null, null, null, null);
while (c.moveToNext())
System.out.println(c.getString(c.getColumnIndex("number")) + ": " + c.getString(c.getColumnIndex("type")));
Ÿ 源代码
ContactsProvider\src\com\android\providers\contacts\ CallLogProvider.java
18.4. 安装程序
Ÿ 需要权限
<uses-permission android:name="android.permission.INSTALL_PACKAGES" />
Ÿ Java代码
File file = new File(Environment.getExternalStorageDirectory(), "test.apk");
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive");
startActivity(intent);
18.5. 关闭程序
Ÿ 杀死当前进程
Process.killProcess(Process.myPid());
Ÿ 退出虚拟机
System.exit(0);
Ÿ 根据包名关闭后台进程
ActivityManager manager = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
manager.restartPackage("cn.itcast.test");
<uses-permission android:name="android.permission.RESTART_PACKAGES" />
18.6. 使用HTML构建界面
Ÿ HTML
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<script type="text/javascript">
function show(jsondata) {
var jsonobjs = eval(jsondata);
var table = document.getElementById("personTable");
for ( var y = 0; y < jsonobjs.length; y++) {
var tr = table.insertRow(table.rows.length);
var td1 = tr.insertCell(0);
var td2 = tr.insertCell(1);
td2.align = "center";
var td3 = tr.insertCell(2);
td3.align = "center";
td1.innerHTML = jsonobjs[y].name;
td2.innerHTML = jsonobjs[y].amount;
td3.innerHTML = "<a href='javascript:contact.call(\"" + jsonobjs[y].phone + "\")'>" + jsonobjs[y].phone + "</a>";
}
}
</script>
</head>
<body onload="javascript:contact.showContacts()">
<table border="0" width="100%" id="personTable" cellspacing="0">
<tr>
<td width="30%">姓名</td>
<td width="30%" align="center">存款</td>
<td align="center">电话</td>
</tr>
</table>
</body>
</html>
Ÿ XML代码
<WebView
android:id="@+id/webView"
android:layout_width="fill_parent"
android:layout_height="fill_parent" />
Ÿ Java代码
public class MainActivity extends Activity {
private WebView webView;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
webView = (WebView) findViewById(R.id.webView);
webView.getSettings().setJavaScriptEnabled(true);
webView.loadUrl("file:///android_asset/index.html");
webView.addJavascriptInterface(new Contact(), "contact");
}
private final class Contact {
public void showContacts() {
String json = "[{\"name\":\"zxx\", \"amount\":\"99999\", \"phone\":\"18600012345\"}]";
webView.loadUrl("javascript:show('" + json + "')");
}
public void call(String phone) {
startActivity(new Intent(Intent.ACTION_CALL, Uri.parse("tel:" + phone)));
}
}
}
18.7. apk文件反编译
Ÿ 使用解压缩工具打开apk文件,找到其中dex文件
Ÿ 创建Java工程,导入dex2jar中的所有jar文件
Ÿ 创建运行环境运行其中pxb.android.dex2jar.v3.Main 类, 指定dex文件地址,会在同目录下生成jar文件
Ÿ 使用jd-gui打开jar文件获取源码
原文链接:http://www.cnblogs.com/pangblog/p/3285769.html
- Android基础总结(三)
- Android 基础总结:(三)Activity
- Android 面试题总结之Android 基础(三)
- Android 面试题总结之Android 基础(三)
- Android基础总结三:BroadcastReceiver总结一
- Android基础(三)
- java基础总结(三)
- Android总结(三)
- Android Notification 基础 (三)
- android基础---textView(三)
- Android基础学习(三)
- 黑马程序员 基础总结(三)
- 精通CSS+DIV基础总结(三)
- Linux常见基础命令总结(三)
- Java SE基础知识点总结(三)
- STM32基础(三)----DMA总结笔记
- 强化学习基础总结(三)
- Java基础(三):Java集合总结
- 排序算法:冒泡排序
- Shader_创建、编写Shader002
- sizeof与strlen
- android实现背景音乐播放
- OpenGL与CUDA互操作方式总结
- Android基础总结(三)
- JavaScript-查找字符串中出现最多的字符和个数
- Java锁Synchronized,对象锁和类锁举例
- POJ2367——Genealogical tree(拓扑排序模板)
- 14.基于Hadoop的数据仓库Hive第1部分
- Android中添加背景音乐的两种方法
- MATLAB中imshow()函数处理图像时出现全白显示的原因
- iOS 一一 自定义cell按钮的点击事件(KVO)
- iscsi磁盘共享扩展