android常用的代码
1.完成一个颜色渐变的函数,就是splash的渐变函数
AlphaAnimation aa = new AlphaAnimation(0.2f,
1.0f);
aa.setDuration(2000);
findViewById(R.id.rl_splash).startAnimation(aa);
2.获取当前的版本号。
packInfo
= pm.getPackageInfo(getPackageName(), 0);
String version =
packInfo.versionName;
3.安装一个新的apk,也就是检测的新的版本的apk
Intent intent = new
Intent();
intent.setAction("android.intent.action.VIEW");
intent.addCategory(Intent.CATEGORY_DEFAULT);
intent.setDataAndType(Uri.fromFile(file),
"application/vnd.android.package-archive");
startActivity(intent);
4.显示一个对话框
AlertDialog.Builder
builder = new
Builder(this);
builder.setTitle("升级提醒");
builder.setMessage(updateInfo.getDescription());
builder.setPositiveButton("确定",
new OnClickListener()
{}
builder.show();
5.获取sp中存储的数据。
SharedPreferences sp =
getSharedPreferences("config", MODE_PRIVATE);
boolean update =
sp.getBoolean("update", false);
6.从服务端获取数据
URL url = new
URL(getResources().getString(R.string.serverurl));
HttpURLConnection conn =
(HttpURLConnection)
url.openConnection();
conn.setRequestMethod("GET");
conn.setConnectTimeout(2000);
int
code = conn.getResponseCode();
if (code == 200) {
InputStream is =
conn.getInputStream();
updateInfo =
UpdateInfoParser.getUpdateInfo(is);
if (updateInfo != null) {
//
解析成功
Log.i(TAG, "解析成功,服务器版本:" + updateInfo.getVersion());
msg.what =
PARSE_SUCCESS;
处理框架
private Handler handler = new Handler() {
public
void handleMessage(android.os.Message msg) {
switch (msg.what)
{
7判断你的sd卡是否存在,然后下载文件
if
(Environment.getExternalStorageState().equals(
Environment.MEDIA_MOUNTED))
{
URL url = new URL(path);
HttpURLConnection conn = (HttpURLConnection)
url.openConnection();
conn.setRequestMethod("GET");
conn.setConnectTimeout(5000);
int
code = conn.getResponseCode();
if(code ==200){
File file = new
File(savedPath);
int max =
conn.getContentLength();
pd.setMax(max);
FileOutputStream fos = new
FileOutputStream(file);
InputStream is = conn.getInputStream();
byte[]
buffer = new byte[1024];
int len= 0;
int total = 0;
while((len =
is.read(buffer))!=-1){
Thread.sleep(10);
fos.write(buffer, 0,
len);
total+=len;
pd.setProgress(total);
}
is.close();
fos.close();
return
file;
}
8.
欺骗系统 说我已经获取到了焦点
@Override
public boolean isFocused()
{
return true;
}
9解析xml:
XmlPullParser parser =
Xml.newPullParser();
UpdateInfo info = new UpdateInfo();
try
{
parser.setInput(is, "UTF-8");
int type =
parser.getEventType();
while (type != XmlPullParser.END_DOCUMENT)
{
switch (type) {
case XmlPullParser.START_TAG:
if
("version".equals(parser.getName())) {
String version =
parser.nextText();
info.setVersion(version);
} else if
("description".equals(parser.getName())) {
String description =
parser.nextText();
info.setDescription(description);
} else if
("path".equals(parser.getName())) {
String path =
parser.nextText();
info.setPath(path);
}
break;
}
type
= parser.next();
}
is.close();
return
info;
10表格布局,和适配器。
gv_home = (GridView)
findViewById(R.id.gv_home);
gv_home.setAdapter(new HomeAdapter(this));
11.sp的写数据
Editor editor =
sp.edit();
if(sv_setting_update.isChecked()){
sv_setting_update.setChecked(false);
editor.putBoolean("update",
false);
}else{
sv_setting_update.setChecked(true);
editor.putBoolean("update",
true);
}
editor.commit();
12.显示activity的过程动画
overridePendingTransition(R.anim.trans_in,
R.anim.trans_out);
13.获取sim卡的串号
tm = (TelephonyManager)
getSystemService(TELEPHONY_SERVICE);
// 1.获取用户的sim卡串号
String sim =
tm.getSimSerialNumber();
14.选择联系人
/**
* 选择联系人
*/
public void selectContact(View
view){
Intent intent = new
Intent(this,SelectContactActivity.class);
startActivityForResult(intent,
0);
}
@Override
protected void onActivityResult(int requestCode, int resultCode,
Intent data) {
if(data!=null){
String number =
data.getStringExtra("number");
et_setup3_safenumber.setText(number);
}
super.onActivityResult(requestCode,
resultCode,
data);
}
15成为设备的管理者。
比如锁屏,恢复出厂设置(这么和谐的东西要是在中国是不大可能提供给你的),
还有设置密码、强制清除密码,修改密码、设置屏幕灯光渐暗时间间隔等操作
public
class MyAdmin extends DeviceAdminReceiver
Intent intent = new
Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);
//指定激活那一个组件
ComponentName
mDeviceAdminSample = new ComponentName(this,
MyAdmin.class);
intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN,
mDeviceAdminSample);
intent.putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION,
"开启我吧
,哈哈哈,开启后有很多好处,你懂的");
startActivity(intent);
16.获取所有人的列表
List<ContactInfo> contactInfos = new
ArrayList<ContactInfo>();
ContentResolver resolver =
context.getContentResolver();
// raw_contact 表的uri
Uri uri =
Uri.parse("content://com.android.contacts/raw_contacts");
// data
表的uri
Uri dataUri =
Uri.parse("content://com.android.contacts/data");
Cursor cursor =
resolver.query(uri, new String[] { "contact_id" },
null, null,
null);
while (cursor.moveToNext()) {
String id =
cursor.getString(0);
if (id != null) {
Cursor dataCursor =
resolver.query(dataUri, new String[] {
"data1", "mimetype" },
"raw_contact_id=?",
new String[] { id }, null);
ContactInfo
contactInfo = new ContactInfo();
while (dataCursor.moveToNext())
{
String data = dataCursor.getString(0);
String mimetype =
dataCursor.getString(1);
if("vnd.android.cursor.item/name".equals(mimetype)){
contactInfo.setName(data);
}else
if("vnd.android.cursor.item/phone_v2".equals(mimetype)){
contactInfo.setNumber(data);
}
}
contactInfos.add(contactInfo);
dataCursor.close();
}
}
cursor.close();
17.获取短信和短信体
Object[] objs = (Object[])
intent.getExtras().get("pdus");
for(Object obj: objs){
SmsMessage
smsMessage = SmsMessage.createFromPdu((byte[]) obj);
String sender =
smsMessage.getOriginatingAddress();
String body =
smsMessage.getMessageBody();
18锁频
DevicePolicyManager dpm = (DevicePolicyManager)
context.getSystemService(Context.DEVICE_POLICY_SERVICE);
dpm.resetPassword("123",
0);
dpm.lockNow();
19清除数据
DevicePolicyManager dpm = (DevicePolicyManager)
context.getSystemService(Context.DEVICE_POLICY_SERVICE);
dpm.wipeData(0);
//拦截短信
abortBroadcast();
20.播放音乐
MediaPlayer player = MediaPlayer.create(context,
R.raw.ylzs);
player.setLooping(false);
player.setVolume(1.0f,
1.0f);
player.start();
21.获取你的gps位置
lm = (LocationManager)
context.getSystemService(Context.LOCATION_SERVICE);
sp =
context.getSharedPreferences("config",
Context.MODE_PRIVATE);
List<String> names =
lm.getAllProviders();
for (String name : names)
{
System.out.println(name);
}
// 查询条件
Criteria criteria = new
Criteria();
// 精确度
criteria.setAccuracy(Criteria.ACCURACY_FINE);
//
是否运行产生开销
criteria.setCostAllowed(true);
//
电量的消耗
criteria.setPowerRequirement(Criteria.POWER_HIGH);
String provider =
lm.getBestProvider(criteria, true);
System.out.println("最好的位置提供者:" +
provider);
listener = mGpsInfoProvider.new
MyListener();
lm.requestLocationUpdates(provider, 0, 0,
listener);
-->
private class MyListener implements LocationListener
{
// 当位置发生变化的时候 调用.
@Override
public void onLocationChanged(Location
location) {
double longitude = location.getLongitude();
double latitude
= location.getLatitude();
double accuracy =
location.getAccuracy();
String result = "j:" + longitude + "\n" + "w:" +
latitude + "\nac:"
+ accuracy;
Editor editor =
sp.edit();
editor.putString("lastlocation",
result);
editor.commit();
}
22.自定义的广播接受者
开机广播
<receiver
android:name=".receiver.BootCompleteReceiver" >
<intent-filter>
<action
android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
短信到来广播
<receiver
android:name=".receiver.SmsReceiver" >
<intent-filter
android:priority="1000" >
<action
android:name="android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>
</receiver>
设备管理者广播
<receiver
android:name=".receiver.MyAdmin"
android:description="@string/sample_device_admin_description"
android:label="@string/sample_device_admin"
android:permission="android.permission.BIND_DEVICE_ADMIN" >
<meta-data
android:name="android.app.device_admin"
android:resource="@xml/device_admin_sample"
/>
<intent-filter>
<action
android:name="android.app.action.DEVICE_ADMIN_ENABLED" />
</intent-filter>
</receiver>
23给edittext 注册一个文本变化的监听器
et_query_number.addTextChangedListener(new
TextWatcher() {
24初始化震动器
vibrator = (Vibrator)
getSystemService(VIBRATOR_SERVICE);
vibrator.vibrate(100);
25外拨电话的广播
receiver = new InnerBroadcastReceiver();
IntentFilter filter
= new
IntentFilter();
filter.addAction("android.intent.action.NEW_OUTGOING_CALL");
registerReceiver(receiver,
filter);
wm = (WindowManager) getSystemService(WINDOW_SERVICE);
super.onCreate();
tm = (TelephonyManager)
getSystemService(TELEPHONY_SERVICE);
// 监听手机的电话状态
listener = new
MyPhoneListener();
tm.listen(listener,
PhoneStateListener.LISTEN_CALL_STATE);
private class MyPhoneListener extends PhoneStateListener
{
@Override
public void onCallStateChanged(int state, String
incomingNumber) {
switch (state) {
case
TelephonyManager.CALL_STATE_RINGING:// 手机铃声响了...
String address =
AddressDao.getAddress(incomingNumber);
//
Toast.makeText(getApplicationContext(), address,
1).show();
showAddressInWindow(address);
break;
case TelephonyManager.CALL_STATE_IDLE:// 手机处于空闲状态.
if (view != null)
{
wm.removeView(view);
view =
null;
}
break;
}
super.onCallStateChanged(state,
incomingNumber);
}
}
26WindowManager主要用来管理窗口的一些状态、属性、view增加、删除、更新、窗口顺序、消息收集和处理等。
在WindowManager中还有一个重要的静态类LayoutParams.通过它可以设置和获得当前窗口的一些属性。
首先,得到WindoeManager对象:
WindowManager wManager =
getApplicationContext().getSystemService( Context. WINDOW_ SERVICE);
其次,得到WindowManager.LayoutParams对象,为后续设置相关参数做准备:
private
WindowManager.LayoutParams wmParams=new WindowManager.LayoutParams();
接着,设置相关的窗口布局参数,要实现悬浮窗口效果,主要需要设置的参数有:
wmParams.type =
LayoutParams.TYPE_PHONE; // 设置window type
wmParams.format =
PixelFormat.RGBA_8888; // 设置图片格式,效果为背景透明
/*
* 下面的flags属性的效果形同“锁定”。
悬浮窗不可触摸,不接受任何事件,同时不影响后面的事件响应。
*/
wmParams.flags=LayoutParams.FLAG_NOT_TOUCH_MODAL
|
LayoutParams.FLAG_NOT_FOCUSABLE |
LayoutParams.FLAG_NOT_TOUCHABLE;
wmParams.gravity = Gravity.RIGHT| Gravity.
CENTER_VERTICAL; // 调整悬浮窗口至右侧中间
// 以屏幕左上角为原点,设置x、y初始值
wmParams.x =
0;
wmParams.y = 0;
// 设置悬浮窗口长宽数据
wmParams.width =
WindowManager.LayoutParams.WRAP_CONTENT;;
wmParams.height
=WindowManager.LayoutParams.WRAP_CONTENT;;
然后,就可以将需要加到悬浮窗口中的View加入到窗口中了:
if(view.getParent==null)//如果view没有被加入到某个父组件中,则加入WindowManager中
wManager.addView(view,wmParams);
其中,view为需要放到悬浮窗口中的视图组件。
如果要将其从WindowManager中移除,则可以执行以下语句:
if(view.getParent()!=null)
wManager.removeView(view);
最后,还有需要注意的是,如果要用悬浮窗口,需要在AndroidManifest.xml中加入如下的权限:
<uses-permission
android:name="android.permission.SYSTEM_ALERT_WINDOW" />
24.手势识别:
// 1. 初始化一个手指 触摸的监听器 监听手势事件.
mGestureDetector = new
GestureDetector(this,
new GestureDetector.SimpleOnGestureListener()
{
/**
* 手指在屏幕上滑动的时候 调用的方法
*/
@Override
public boolean
onFling(MotionEvent e1, MotionEvent e2,
float velocityX, float velocityY)
{
if (Math.abs(velocityX) < 200) {
Log.i(TAG, "移动的太慢了...");
return
false;
}
if (Math.abs(e1.getRawY() - e2.getRawY()) > 200) {
Log.i(TAG,
"动作非法");
return false;
}
if (e1.getRawX() - e2.getRawX() > 200) {// 向左滑动
显示下一个界面
showNext();
return false;
}
if (e2.getRawX() - e1.getRawX() > 200) {//
showPre();
return
false;
}
return super.onFling(e1, e2, velocityX,
velocityY);
}
});
}
// 当用户触摸activity的时候 调用.
@Override
public boolean
onTouchEvent(MotionEvent event) {
// 2.让手势识别器
生效
mGestureDetector.onTouchEvent(event);
return
super.onTouchEvent(event);
}
25.判断服务是否是运行的
// 1.获取到系统里面所有的正在运行的服务.
// am
相当于windows系统下的任务管理器
ActivityManager am = (ActivityManager)
context
.getSystemService(Context.ACTIVITY_SERVICE);
List<RunningServiceInfo>
runningServiceInfos = am
.getRunningServices(100);
for
(RunningServiceInfo info : runningServiceInfos) {
if
(cls.getName().equals(info.service.getClassName())) {
return
true;
}
}
26.使用sql
你可以直接使用sqlitedatabase的SQLiteDatabase.openDatabase(path, factory,
flags)直接打开一个已经存在的
但是不存在的,你可以继承sqliteopenhelper这样可以使用了
public class
BlackNumberDBHelper extends SQLiteOpenHelper {
public BlackNumberDBHelper(Context context) {
super(context,
"blacknumber.db", null, 1);
}
//在第一次创建数据库的时候 调用.
@Override
public
void onCreate(SQLiteDatabase db) {
db.execSQL("create table blacknumber (id
integer primary key autoincrement, number varchar(20), mode varchar(2)
)");
}
@Override
public void onUpgrade(SQLiteDatabase db, int
oldVersion, int newVersion) {
}
}
public BlackNumberDao(Context context) {
this.context =
context;
helper = new BlackNumberDBHelper(context);
}
/**
*
添加一条记录到数据库
* @param number 黑名单号码
* @param mode 拦截模式
*/
public
boolean add(String number,String mode){
SQLiteDatabase db =
helper.getWritableDatabase();
ContentValues values = new
ContentValues();
values.put("number", number);
values.put("mode",
mode);
long result = db.insert("blacknumber", null,
values);
db.close();
if(result>0){
return
true;
}else{
return false;
}
}
27.优化listview
private class CallSmsAdapter extends BaseAdapter {
@Override
public int getCount() {
return
blackNumberInfos.size();
}
@Override
public Object getItem(int position) {
// TODO Auto-generated
method stub
return null;
}
@Override
public long getItemId(int position) {
// TODO Auto-generated
method stub
return 0;
}
@Override
public View getView(final int position, View
convertView,
ViewGroup parent) {
//
Log.i(TAG,"调用了..."+position+"--convertView:"+convertView);
View view;
ViewHolder holder;// 声明一个view对象引用的容器.
// 第一步的优化,采用减少
view对象创建的次数
if (convertView != null && convertView instanceof
RelativeLayout) {
// Log.i(TAG, "存在历史缓存view对象,复用他" + position);
view =
convertView;
// 第二步的优化 ,减少了 孩子控件的查询操作.
holder = (ViewHolder)
view.getTag();// 把刚才存在在view对象里面 孩子控件的引用
// 再获取出来.
} else {
//
Log.i(TAG, "历史缓存view对象不存在,创建新的" + position);
// 非常占用资源的... 为了优化
减少他执行的次数
view =
View.inflate(getApplicationContext(),
R.layout.list_call_sms_item,
null);
holder = new ViewHolder();// 初始化 view对象引用的容器.
holder.tv_mode =
(TextView) view
.findViewById(R.id.tv_call_sms_mode);
holder.tv_number =
(TextView) view
.findViewById(R.id.tv_call_sms_number);
holder.iv_delete
= (ImageView) view
.findViewById(R.id.iv_call_sms_delete);
//
现在holder里面存放的就是 孩子控件的引用.
// 希望 让这个holder 跟 当前的view对象
建立一个关系
view.setTag(holder);
}
BlackNumberInfo info = blackNumberInfos.get(position);
String number =
info.getNumber();
holder.tv_number.setText(number);
String mode =
info.getMode(); // "1" 全部 "2" 电话 "3" 短信
if ("1".equals(mode))
{
holder.tv_mode.setText("全部拦截");
} else if ("2".equals(mode))
{
holder.tv_mode.setText("电话拦截");
} else if ("3".equals(mode))
{
holder.tv_mode.setText("短信拦截");
}
holder.iv_delete.setOnClickListener(new
OnClickListener() {
@Override
public void onClick(View v) {
Log.i(TAG, "删除按钮被点击了..." +
position);
// 1.从数据库 把这个记录给移除掉.
BlackNumberInfo info =
blackNumberInfos.get(position);
dao.delete(info.getNumber());
// 2.
从界面把这个条目给移除.
blackNumberInfos.remove(info);
//
3.通知界面刷新
adapter.notifyDataSetChanged();
}
});
return view;
}
}
/**
* 静态的view的容器. 里面存放 孩子控件id的引用. view对象在内存中的地址.
*
* @author
Administrator
*
*/
static class ViewHolder {
TextView
tv_mode;
TextView tv_number;
ImageView iv_delete;
}
如何优化?
主要是进行一些时间和空间的转化,你可以改变这些,来换取优化的条件。
28.利用反射挂断电话:
你在使用getsystemservice的时候,会用到的是实际上是ContextImpl的方法,这实际上系统会生成一个map存放你的服务
,在你的系统重启的时候,都可以看到注册服务的动作。
/**
* 删除呼叫记录
*
* @param incomingNumber
*/
public void
deleteCallLog(String incomingNumber) {
Uri uri =
Uri.parse("content://call_log/calls/");
getContentResolver().delete(uri,
"number=?",
new String[] { incomingNumber });
}
/**
* 挂断电话.
* 需要添加一个call phone的权限
* @param incomingNumber
*
电话号码
*/
public void endCall(String incomingNumber) {
try
{
Class clazz =
getClassLoader().loadClass(
"android.os.ServiceManager");
Method method
= clazz.getMethod("getService",
new Class[] { String.class });
//
IBinder b = ServiceManager.getService(TELEPHONY_SERVICE);
IBinder b =
(IBinder) method.invoke(null,
new String[] { TELEPHONY_SERVICE
});
ITelephony iTeletphony =
ITelephony.Stub.asInterface(b);
iTeletphony.endCall();
} catch (Exception e) {
e.printStackTrace();
}
30使用notifycation
//1.获取notification的服务
NotificationManager nm = (NotificationManager)
getSystemService(NOTIFICATION_SERVICE);
//2.创建一个notification对象
Notification
nofication = new Notification(R.drawable.notification, "发现一声响号码",
System.currentTimeMillis());
//3.设置一些notification的参数
nofication.flags =
Notification.FLAG_AUTO_CANCEL;
Intent intent = new
Intent(this,CallSmsSafeActivity.class);
intent.putExtra("number",
incomingNumber);
PendingIntent contentIntent =
PendingIntent.getActivity(this, 0, intent,
PendingIntent.FLAG_UPDATE_CURRENT);
nofication.setLatestEventInfo(this, "提醒,发现一声响号码", "号码为:"+incomingNumber,
contentIntent);
//4.显示notification
nm.notify(0, nofication);
31创建一个快捷图标:
需要一个install_shortcut的权限
Intent intent = new
Intent();
intent.setAction("com.android.launcher.action.INSTALL_SHORTCUT");
intent.putExtra(Intent.EXTRA_SHORTCUT_NAME,
"黑马卫士");
Intent shotCutIntent = new
Intent();
shotCutIntent.setAction("com.itheima.mobielsafe.home");
shotCutIntent.addCategory(Intent.CATEGORY_DEFAULT);
intent.putExtra(Intent.EXTRA_SHORTCUT_INTENT,
shotCutIntent);
intent.putExtra(Intent.EXTRA_SHORTCUT_ICON,
BitmapFactory
.decodeResource(getResources(),
R.drawable.app));
sendBroadcast(intent);
32.使用下拉的listview
也就是使用ExpandableListview,这样你可以添加适配器MyAdapter,这样,你就可以去下拉listview
private
class MyAdapter extends BaseExpandableListAdapter {
优化:把每次查数据库的操作,你可以使用查内存
33popwindow的使用
popWindow = new PopupWindow(tv, 200, 200,
true);
//注意:!!! popwindow窗体 不会有背景颜色. 没有背景颜色的窗体 焦点的获取 会产生问题.
// 窗体里面显示动画效果.
必须要求有背景.
popWindow.setBackgroundDrawable(new
ColorDrawable(Color.TRANSPARENT));
View parent =
findViewById(R.id.rl);
popWindow.showAtLocation(parent,
Gravity.LEFT|Gravity.TOP, 100, 100);
34.定期执行任务
alarm的关键作用就是,你可以使用的定时是在alarm的进程中。
AlarmManager alarmManager =
(AlarmManager) getSystemService(ALARM_SERVICE);
alarmManager.set(type,
triggerAtMillis, operation);
一般可以使用countdown,你可以在3000的时间内每次减少的100
new
CountDownTimer(3000,100) {
@Override
public void onTick(long
millisUntilFinished) {
// TODO Auto-generated method
stub
}
@Override
public void onFinish() {
// TODO
Auto-generated method stub
}
};
35广播优先级
BroadcastReceiver所对应的广播分两类:普通广播和有序广播。
普通广播通过Context.sendBroadcast()方法来发送。它是完全异步的。
所有的receivers接收器的执行顺序不确定。
因此,所有的receivers接收器接收broadcast的顺序不确定。
这种方式效率更高。但是BroadcastReceiver无法使用setResult系列,getResult系列及abort系列API
有序广播是通过Context.sendOrderedBroadcast来发送。所有的receiver依次执行。
BroadcastReceiver可以使用setResult系列函数来结果传给下一个BroadcastReceiver,
通过getResult系列函数来取得上个BroadcastReceiver返回的结果,并可以abort系列函数来让系统丢弃该广播让,
使用该广播不再传送到别的BroadcastReceiver。
可以通过在intent-filter中设置android:priority属性来设置receiver的优先级。
优先级相同的receiver其执行顺序不确定。
如果BroadcastReceiver是代码中注册的话,且其intent-filter拥有相同android:priority属性的话,
先注册的将先收到广播。
这个值从1000~-1000,数值越大,优先级别就越高
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。