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

调用ListViewgetItemAtPosition(int)方法可以获取封装数据的容器

如果传入的是BaseAdapter,获取到的就是我们自定义方法中返回的内容

如果传入的是SimpleAdapter,获取到的就是一个Map<String, ?>

如果传入的是SimpleCursorAdapter,获得到的就是一个Cursor,并且Cursor以指向选中的一条记录

14.2. 单选(RadioGroup)

 

Ÿ 定义<RadioGroup>

Ÿ 在<RadioGroup>中定义<RadioButton><Button>

Ÿ 处理Button的点击事件

Ÿ 根据ID获取RadioGroup对象,调用其getCheckedRadioButtonId()方法可以获取其中被选中的RadioGroupID

Ø 代码

<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)

 

Ø 添加菜单项

Ÿ 重写ActvityonCreateOptionsMenu(Menu menu)方法

Ÿ 添加菜单项

调用方法中参数menuadd(CharSequence title) 方法

Ÿ 添加子菜单

调用menu对象的addSubMenu(final CharSequence title)

该方法返回一个SubMenu对象

Ÿ 添加子菜单的菜单项

调用SubMenu对象的add(CharSequence title) 方法

Ø 处理菜单点击事件

Ÿ 重写ActivityonOptionsItemSelected(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="style2parent="@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. 国际化

  

 

Ÿ 在valuesdrawable文件夹后加上语言以及地区名,程序中需要国际化的部分使用资源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(listenersensor, 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(listenersensor);

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.xpoint.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, nullnullnullnull);

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, nullnullnullnull);

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

原创粉丝点击