安卓Java知识方法
- 主线程handler机制
- 子线程handler机制:
- 创建子线程一般方法
- 利用Bufferedwriter写入字符串到文件方法:
- 利用Bufferedreader读取文本方法:
- 添加带有编辑框的对话框方法:
- 文件替换和删除方法:
- 设置按钮监听器事件:
- 剪切板的方法:
- adbshell命令类方法
- 悬浮窗设置方法:
- jsoup带cookies爬取静态网页源码方法
- 用jsoup处理本地网页的方法
- 取得系统时间方法:
- 保留两位小数方法
- int,float,double与string之间的转换
- 通过网址直接下载并储存图片方法以及图片压缩方法:
- 定时执行任务方法:
- 给listview(以及spinner)添加数据源及arraylist和string数组方法
- 消息提示方法
- expanderview方法:
- 安卓客户端与服务端的交互方法:
- glide加载图片方法(需要glide.jar包)
- SharedPreferences储存数据方法
- 附录1 :input keyevent值所对应的字符
- 附录2:主进程中添加悬浮窗的方法
主线程handler机制
public Handler handler1=new Handler(){
@Override
public void handleMessage(Message msg)
{
// TODO: Implement this method
super.handleMessage(msg);
switch(msg.what){
case 0:{}break;
case 1:{}break;
}
}
};
子线程handler机制:
class LooperThread extends Thread {
public Handler handler;
@Override
public void run() {
super.run();
Looper.prepare();
handler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch(msg.what){
case 0:{
Thread.sleep(2000);//线程睡眠2秒
}break;
case 1:{}break;
}
}
};
Looper.loop();
//单线程执行一次的代码写在此
}
//重写run函数
}
主线程向子线程通信方法:
LooperThread looperthread4=new LooperTheread();
Message msg1=Message.obtain();
msg1.what=1;//传递int型特殊数字消息
msg1.arg1=4;//传递int型普通数字消息
msg1.arg2=5;
msg1.obj="abc";//传递string型普通字符串
looperthread4.handler.sendMessage(msg1);
子线程向主线程通信方法:
Message msg1=new Message();
msg1.what=1;//传递int型特殊数字消息
msg1.arg1=4;//传递int型普通数字消息
msg1.arg2=5;
msg1.obj="abc";//传递string型普通字符串
handler1.sendMessage(msg1);
创建子线程一般方法
Thread thread1=new Thread(new Runnable(){
@Override
public void run()
{
Thread.sleep(2000);//线程睡眠2秒
// TODO: Implement this method
}
});
thread1.start();//执行子线程代码
利用Bufferedwriter写入字符串到文件方法:
public void Writetxttofile(String strcontent, String filePath,
String fileName) {
// 生成文件夹之后,再生成文件,不然会出错
makeFilePath(filePath, fileName);// 生成文件
String strFilePath = filePath + fileName;
// 每次写入时,都换行写
String strContent = strcontent + "\r\n";
try {
File file = new File(strFilePath);
if (!file.exists()) {
file.getParentFile().mkdirs();
file.createNewFile();
}
FileWriter ofis1=new FileWriter(file,true)
BufferedWriter owriter1=new BufferedWriter(ofis1);
owriter1.write(strContent);
owriter1.close();
} catch (Exception e) {
}
}
/**
* 生成文件
*/
public void makeFilePath(String filePath, String fileName) {
File file = null;
makeRootDirectory(filePath);// 生成文件夹
try {
file = new File(filePath + fileName);
if (!file.exists()) {
file.createNewFile();
}
} catch (Exception e) {
e.printStackTrace();
}
return;
}
/**
* 生成文件夹
*/
public static void makeRootDirectory(String filePath) {
File file = null;
try {
file = new File(filePath);
if (!file.exists()) {
file.mkdir();
}
} catch (Exception e) {
}
}
利用Bufferedreader读取文本方法:
String result1="";
File f1=new File(Environment.getExternalStorageDirectory().getAbsolutePath()+"/Formoney/numberofsoftware.txt");
if(file.exists()){
try
{
BufferedInputStream fis1= new BufferedInputStream(new FileInputStream(f1));
try
{
BufferedReader reader1= new BufferedReader(new InputStreamReader(fis1, "utf-8"), 5 * 1024 * 1024);
String line1= "";
try
{
while ((line1 = reader1.readLine()) != null)
{result1=line1;
}
}
catch (IOException e)
{}
try
{
reader1.close();
fis1.close();
}
catch (IOException e)
{}
}
catch (UnsupportedEncodingException e)
{}
}
catch (FileNotFoundException e)
{}
}//承接if
添加带有编辑框的对话框方法:
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);//主活动子活动及服务均通用,在哪个活动中则用相应活动名称+.this
builder.setTitle(title); //设置对话框标题
builder.setIcon(android.R.drawable.btn_star);
final EditText edit = new EditText(MainActivity.this);
builder.setView(edit);
builder.setPositiveButton("确认", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {x=edit.getText().toString();
}
});
builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
});
builder.setNeutralButton("第三个按钮", new DialogInterface.OnClickListener(){
@Override
public void onClick(DialogInterface p1, int p2)
{//方法
}
});
builder.setCancelable(true); //设置按钮是否可以按返回键取消,false则不可以取消
AlertDialog dialog = builder.create(); //创建对话框
dialog.setCanceledOnTouchOutside(true); //设置弹出框失去焦点是否隐藏,即点击屏蔽其它地方是否隐藏
//悬浮窗对话框需要增加的条件代码
//
dialog.show();
文件替换和删除方法:
try{
File rename1=new File(Environment.getExternalStorageDirectory().getAbsolutePath()+"/Formoney/replacedinfoffilter2.txt");
File rename2=new File(Environment.getExternalStorageDirectory().getAbsolutePath()+"/Formoney/infoffilter2.txt"); rename1.renameTo(rename2);
}catch(Exception e){}
//rename2.delete();//删除
设置按钮监听器事件:
//点击
Button button1=findViewById(R.id.mainButton1);
button1.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View p1)
{
// TODO: Implement this method
}
});
//长按
button1.setOnLongClickListener(new OnLongClickListener(){
@Override
public boolean onLongClick(View p1)
{
// TODO: Implement this method
return false;
}
});
剪切板的方法:
(import android.content.*)
ClipboardManager clipboard1 = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);
clipboard1.setText("stringvalue");
adbshell命令类方法
public class RootShellCmd {
private OutputStream os;
{}
/**
* 执行shell指令
*
* @param cmd
* 指令
*/
public final void exec(String cmd) {
try {
if (os == null) {
os = Runtime.getRuntime().exec("su").getOutputStream();
}
os.write(cmd.getBytes());
os.flush();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 后台模拟全局按键
*
* @param keyCode
* 键值
*/
public final void simulateKey(int keyCode) {
exec("input keyevent " + keyCode + "\n");
}
public final void tap1(int x,int y){
exec("input tap " + x+" "+y+ "\n");
}
public final void sendmsg1(String s){
exec("input text '"+s+"' "+"\n");
}
public final void swipe1(int x1,int y1,int x2,int y2){
exec("input swipe "+x1+" "+y1+" "+x2+" "+y2+"\n");
}
public final void swipe2(int x1,int y1,int x2,int y2,int time){
exec("input swipe "+x1+" "+y1+" "+x2+" "+y2+" "+time+"\n");
}
}
//在各种线程里定义一个类的对象方法:final RootShellCmd cmd1=new RootShellCmd();
//执行该对象所在类的某一个方法cmd1.exec("input keyevent 4"+"\n");
悬浮窗设置方法:
public class FxService extends Service
{
//定义浮动窗口布局
LinearLayout mFloatLayout;
WindowManager.LayoutParams wmParams;
//创建浮动窗口设置布局参数的对象
WindowManager mWindowManager;
Button mFloatView;
@Overri
public void onCreate()
{
// TODO Auto-generated method stub
super.onCreate();
createFloatView();
}
@Override
public IBinder onBind(Intent intent)
{
// TODO Auto-generated method stub
return null;
}
private void createFloatView()
{
wmParams = new WindowManager.LayoutParams();
//获取的是WindowManagerImpl.CompatModeWrapper
mWindowManager = (WindowManager)getApplication().getSystemService(getApplication().WINDOW_SERVICE);
//设置window type
wmParams.type = LayoutParams.TYPE_SYSTEM_ALERT;
//设置图片格式,效果为背景透明
wmParams.format = PixelFormat.RGBA_8888;
//设置浮动窗口不可聚焦(实现操作除浮动窗口外的其他可见窗口的操作)
wmParams.flags = LayoutParams.FLAG_NOT_FOCUSABLE;
//调整悬浮窗显示的停靠位置为左侧置顶
wmParams.gravity = Gravity.LEFT | Gravity.TOP;
// 以屏幕左上角为原点,设置x、y初始值,相对于gravity
wmParams.x = 270;
wmParams.y = 0;
//设置悬浮窗口长宽数据
wmParams.width = WindowManager.LayoutParams.WRAP_CONTENT;
wmParams.height = WindowManager.LayoutParams.WRAP_CONTENT;
// 设置悬浮窗口长宽数据
//wmParams.width = 100;
// wmParams.height = 100;
LayoutInflater inflater = LayoutInflater.from(getApplication());
//获取浮动窗口视图所在布局
mFloatLayout = (LinearLayout) inflater.inflate(R.layout.FxService, null);
//添加mFloatLayout
mWindowManager.addView(mFloatLayout, wmParams);
//浮动窗口按钮
mFloatView = (Button)mFloatLayout.findViewById(R.id.FxServiceButton1);
mFloatLayout.measure(View.MeasureSpec.makeMeasureSpec(0,
View.MeasureSpec.UNSPECIFIED), View.MeasureSpec
.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));
//设置监听浮动窗口的触摸移动
mFloatView.setOnTouchListener(new OnTouchListener()
{
@Override
public boolean onTouch(View v, MotionEvent event)
{
// TODO Auto-generated method stub
//getRawX是触摸位置相对于屏幕的坐标,getX是相对于按钮的坐标
wmParams.x = (int) event.getRawX() - mFloatView.getMeasuredWidth()/2;
//减25为状态栏的高度
wmParams.y = (int) event.getRawY() - mFloatView.getMeasuredHeight()/2-80;
//刷新
mWindowManager.updateViewLayout(mFloatLayout, wmParams);
return false; //此处必须返回false,否则OnClickListener获取不到监听
}
});
mFloatView.setOnLongClickListener(new OnLongClickListener(){
@Override
public boolean onLongClick(View p1)
{
//方法
}
});
mFloatView.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View v)
{
// TODO Auto-generated method stub
//Toast.makeText(FxService.this, "onClick", Toast.LENGTH_SHORT).show();
}
});
}
@Override
public void onDestroy()
{
// TODO Auto-generated method stub
super.onDestroy();
if(mFloatLayout != null)
{
//移除悬浮窗口
mWindowManager.removeView(mFloatLayout);
System.exit(0);
stopSelf();
}
}
}//service类结尾
jsoup带cookies爬取静态网页源码方法
String url ="https://login.taobao.com/member/login.jhtml?spm=a21bo.2017.754894437.1.5af911d9bLLw4T&f=top&redirectURL=https%3A%2F%2Fwww.taobao.com%2F";
Connection.Response res=Jsoup.connect(url).data("TPL_username","18600411573","TPL_password","sjb152535").method(Method.POST).execute();
Document doc=res.parse();
Map s=res.cookies();
for(int page=0;page<44*pages;page=page+44){
Document doc1=Jsoup.connect("https://s.taobao.com/search?q="+name+"s="+page).cookies(s).get();
Elements element1=doc1.select("script");
int i=0;
String data1=null;
data1=element1.get(i).data();
用jsoup处理本地网页的方法
String path1=Environment.getExternalStorageDirectory().getAbsolutePath()+"/windows/BstSharedFolder/Formoney/xianyu/goodsinformation"+obj1+index1+"x"+index0+".html";
File file1=new File(path1);
try
{
Document doc2=Jsoup.parse(file1, "gbk");
Elements ele1=doc2.select(".item-list-wrap");
for(int i=1;i<=ele1.select("a").size();i++){
String id1=ele1.select("a.item-wrap:nth-child("+i+")").attr("href").toString();
String title=ele1.select("a.item-wrap:nth-child("+i+") > div:nth-child(2) > p:nth-child(1)").text();
}catch(IOException e){}
取得系统时间方法:
Time t=new Time(); // or Time t=new Time("GMT+8"); 加上Time Zone资料。
t.setToNow(); // 取得系统时间。
int year = t.year;
int month = t.month+1;
int day = t.monthDay;
int hour = t.hour; // 0-23
int minute = t.minute;
int second = t.second;
保留两位小数方法
DecimalFormat df=new DecimalFormat("0.00");
String newstr=df.format(oldstr-doublenum-longnum);
int,float,double与string之间的转换
int int1=0;
double double1=7;
float float1=4;
String stringvalue="6";
int1=Integer.valueOf(stringvalue).intValue();//可不加.intValue()
stringvalue=String.valueOf(int1).toString();//可不加.toString()
float1=Float.parseFloat(stringvalue);
stringvalue=String.valueOf(float1);
stringvalue=String.valueOf(double1);
double1=Double.parseDouble(stringvalue);
通过网址直接下载并储存图片方法以及图片压缩方法:
try {
String urlPath =getimgurl();
URL url = new URL(urlPath);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setConnectTimeout(6*1000); // 注意要设置超时,设置时间不要超过10秒,避免被android系统回收
if (conn.getResponseCode() != 200) throw new RuntimeException("请求url失败");
InputStream inSream = conn.getInputStream();
//把图片保存到项目的根目录
readAsFile(inSream, new File(Environment.getExternalStorageDirectory()+"/DCIM/Camera/"+"IMG_20190109_173606.jpg"));
//Toast.makeText(getApplicationContext(),"ok",Toast.LENGTH_SHORT).show();
Thread.sleep(5000);
File file1=new File(Environment.getExternalStorageDirectory()+"/DCIM/Camera/"+"IMG_20190109_173606.jpg");
compressBitmap(Environment.getExternalStorageDirectory()+"/DCIM/Camera/"+"IMG_20190109_173606.jpg",file1);
} catch (Exception e) {
e.printStackTrace();
}
public void compressBitmap(String filePath, File file){
// 数值越高,图片像素越低
int inSampleSize = 4;
BitmapFactory.Options options = new BitmapFactory.Options();
//采样率
options.inSampleSize = inSampleSize;
Bitmap bitmap = BitmapFactory.decodeFile(filePath, options);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
// 把压缩后的数据存放到baos中
bitmap.compress(Bitmap.CompressFormat.JPEG, 100 ,baos);
try {
FileOutputStream fos = new FileOutputStream(file);
fos.write(baos.toByteArray());
fos.flush();
fos.close();
} catch (Exception e) {
e.printStackTrace();
}
}
定时执行任务方法:
Timer timer1=new Timer();
TimerTask task1=new TimerTask(){
@Override
public void run()
{
cmd2.tap1(267,916);
// TODO: Implement this method
}
};
timer1.schedule(task1,10000);//定时执行任务
给listview(以及spinner)添加数据源及arraylist和string数组方法
public ArrayList<String> listofkeyinf=new ArrayList<String>();
listofkeyinf.add(0,''stringvalue'');
listofkeyinf.add("stringvalue");
listofkeyinf.get(0);
listofkeyinf.clear();//清除arraylist里的所有数据
listofkeyinf.size()//arraylist的数据数目
listofkeyinf.indexOf("stringvalue");
listofkeyinf.remove(0);
listofkeyinf.contains("stringvalue");//布尔值
listofkeyinf.lastIndexOf("stringvalue");
ListView listview1=findViewById(R.id.mainListView1);
//arraylist转化为数组
String[] listofkeyinf1=listofkeyinf.toArray(new String[listofkeyinf.size()]);
ArrayAdapter<String> arrayadapter1=new ArrayAdapter<String>(MainActivity.this,android.R.layout.simple_list_item_1,listofkeyinf1);
listview1.setAdapter(arrayadapter1);
listofkeyinf1.length;//数组的数据数目(得到int型数字)
listofkeyinf1[0];//得到数组下标为0的数据(具体数据类型由数组定义决定)
//spinner方法
final Spinner spinner2=findViewById(R.id.CusasiSpinner1);
Spinner2.setVisibility(0(正常),4(不可见但占用位置),8(不可见且不占用位置));
final ArrayAdapter<String> adapter2=new ArrayAdapter<String>(CursasiActivity.this,android.R.layout.simple_list_item_1,String[]);
Spinner2.setAdapter(adapter2);
Spinner2.setOnItemSelectedListener(new OnItemSelectedListener(){
@Override
public void onItemSelected(AdapterView<?> p1, View p2, int which, long p4)
{
switch(childPosition){
case 0:{}break;
case 1{}break;
}
// TODO: Implement this method
}
@Override
public void onNothingSelected(AdapterView<?> p1)
{
// TODO: Implement this method
}
});
消息提示方法
Toast.makeText(MainActivity.this,"已存入数据库",Toast.LENGTH_SHORT).show();
expanderview方法:
private ExpandableListView expandableListView;
private String[] groups = {" 根据日期查询销售情况"," 根据总商品列表查询销售情况"};
//注意,字符数组不要写成{{"A1,A2,A3,A4"}, {"B1,B2,B3,B4,B5"}, {"C1,C2,C3,C4"}}*/
public String[][] childs={{"请选择年份:","---","---"},{"当前商品销售情况","历史商品销售情况"}};
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
// Set sub.xml as user interface layout
setContentView(R.layout.Cusasi);
expandableListView = (ExpandableListView) findViewById(R.id.CusasiExpandableListView1);
expandableListView.setAdapter(new MyExpandableListView());
expandableListView.setOnChildClickListener(new ExpandableListView.OnChildClickListener(){
@Override
public boolean onChildClick(ExpandableListView p1, View p2, int p3, int p4, long p5)
{
if(p3==1){
switch(p4){
case 0:{}break;
case 1:{}break;
}
}
// TODO: Implement this method
return false;
}
});
}
class MyExpandableListView extends BaseExpandableListAdapter {
//返回一级列表的个数
@Override
public int getGroupCount() {
return groups.length;
}
//返回每个二级列表的个数
@Override
public int getChildrenCount(int groupPosition) { //参数groupPosition表示第几个一级列表
//Log.d("smyhvae", "-->" + groupPosition);
return childs[groupPosition].length;
}
//返回一级列表的单个item(返回的是对象)
@Override
public Object getGroup(int groupPosition) {
return groups[groupPosition];
}
//返回二级列表中的单个item(返回的是对象)
@Override
public Object getChild(int groupPosition, int childPosition) {
return childs[groupPosition][childPosition]; //不要误写成groups[groupPosition][childPosition]
}
@Override
public long getGroupId(int groupPosition) {
return groupPosition;
}
@Override
public long getChildId(int groupPosition, int childPosition) {
return childPosition;
}
//每个item的id是否是固定?一般为true
@Override
public boolean hasStableIds() {
return true;
}
//【重要】填充一级列表
@Override
public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = getLayoutInflater().inflate(R.layout.item_group, null);
}
TextView tv_group = (TextView) convertView.findViewById(R.id.tv_group);
tv_group.setText(groups[groupPosition]);
return convertView;
}
//【重要】填充二级列表
@Override
public View getChildView(final int groupPosition, final int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = getLayoutInflater().inflate(R.layout.item_child2, null);
}
final Spinner Spinner2=convertView.findViewById(R.id.item_child2Spinner2);
Spinner2.setVisibility(groupPosition*8);
//String[] s={"1","2","3"};
//String[][][] strtime3={{{}},{{}},{{}}};
//String[][] years2=years.toArray(new String[quantityofsoftware][]);
String[][][] strtime3=listoftime3.toArray(new String[3][][]);
//String[][][] s={{{"---","2019"},{"---","2019"}},{{"---","1","2"},{"---","3","4","5"}},{{"---","22","23"},{"---","27"}}};
final ArrayAdapter<String> adapter2=new ArrayAdapter<String>(CursasiActivity.this,android.R.layout.simple_list_item_1,strtime3[childPosition][getchoice()]);
Spinner2.setAdapter(adapter2);
Spinner2.setOnItemSelectedListener(new OnItemSelectedListener(){
@Override
public void onItemSelected(AdapterView<?> p1, View p2, int which, long p4)
{switch(childPosition){
case 0:{
}break;
case 1:{
}break;
}
// TODO: Implement this method
}
@Override
public void onNothingSelected(AdapterView<?> p1)
{
// TODO: Implement this method
}
});
//ImageView iv_child = (ImageView) convertView.findViewById(R.id.iv_child);
TextView tv_child2= (TextView) convertView.findViewById(R.id.item_child2TextView2);
//iv_child.setImageResource(resId);
tv_child2.setText(childs[groupPosition][childPosition]);
return convertView;
}
//二级列表中的item是否能够被选中?可以改为true
@Override
public boolean isChildSelectable(int groupPosition, int childPosition) {
return true;
}
}
}
安卓客户端与服务端的交互方法:
final Thread thr1=new Thread(new Runnable(){
@Override
public void run()
{try{
String username1=tv1.getText().toString();
String password1=tv2.getText().toString();
String connectURL="http://191927353580.xhcloud.design/";
HttpPost httpRequest = new HttpPost(connectURL);
List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("user1",username1));
params.add(new BasicNameValuePair("pwd1",password1));
try {
HttpEntity httpEntity = new UrlEncodedFormEntity(params,"utf-8");
httpRequest.setEntity(httpEntity);
HttpClient httpClient = new DefaultHttpClient();
HttpResponse httpResponse = httpClient.execute(httpRequest);
if(httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK){
String result = EntityUtils.toString(httpResponse.getEntity());
//tv.setText(result);
Looper.prepare();
Toast.makeText(MainActivity.this,result,Toast.LENGTH_SHORT).show();
Looper.loop();
}else{Looper.prepare();
Toast.makeText(MainActivity.this,"error",Toast.LENGTH_SHORT).show();
Looper.loop();
// tv.setText("request error");
}
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}catch(Exception e){
}
// TODO: Implement this method
}
});
glide加载图片方法(需要glide.jar包)
Glide.with(this)
.load(url)
.placeholder(R.drawable.loading)
.error(R.drawable.error)
.diskCacheStrategy(DiskCacheStrategy.NONE)
.override(100, 100)
.into(imageView);
SharedPreferences储存数据方法
public static void saveUserInfo(Context context, String user1,String money1,String status) {
/**
* SharedPreferences将用户的数据存储到该包下的shared_prefs/config.xml文件中,
* 并且设置该文件的读取方式为私有,即只有该软件自身可以访问该文件
*/
SharedPreferences sPreferences = context.getSharedPreferences("config", context.MODE_PRIVATE);
SharedPreferences.Editor editor = sPreferences.edit();
//当然sharepreference会对一些特殊的字符进行转义,使得读取的时候更加准确
editor.putString("username1",user1);
editor.putString("money1", money1);
editor.putString("status", status);
//切记最后要使用commit方法将数据写入文件
editor.commit();}
//在主活动中调用方法
SharedPreferences sPreferences = getSharedPreferences("config", MODE_PRIVATE);
String money1=sPreferences.getString("money1","0.00");
//精简代码如下
public static void savestringinf(Context context,String name,String stringvalue){
SharedPreferences sPreferences = context.getSharedPreferences("config", context.MODE_PRIVATE);
SharedPreferences.Editor editor=sPreferences.edit();
editor.putString(name,stringvalue);//也可以editor.putInt(name,integer);
editor.commit();}
附录1 :input keyevent值所对应的字符
0 --> “KEYCODE_UNKNOWN”
1 --> “KEYCODE_MENU”
2 --> “KEYCODE_SOFT_RIGHT”
3 --> “KEYCODE_HOME”
4 --> “KEYCODE_BACK”
5 --> “KEYCODE_CALL”
6 --> “KEYCODE_ENDCALL”
7 --> “KEYCODE_0”
8 --> “KEYCODE_1”
9 --> “KEYCODE_2”
10 --> “KEYCODE_3”
11 --> “KEYCODE_4”
12 --> “KEYCODE_5”
13 --> “KEYCODE_6”
14 --> “KEYCODE_7”
15 --> “KEYCODE_8”
16 --> “KEYCODE_9”
17 --> “KEYCODE_STAR”
18 --> “KEYCODE_POUND”
19 --> “KEYCODE_DPAD_UP”
20 --> “KEYCODE_DPAD_DOWN”
21 --> “KEYCODE_DPAD_LEFT”
22 --> “KEYCODE_DPAD_RIGHT”
23 --> “KEYCODE_DPAD_CENTER”
24 --> “KEYCODE_VOLUME_UP”
25 --> “KEYCODE_VOLUME_DOWN”
26 --> “KEYCODE_POWER”
27 --> “KEYCODE_CAMERA”
28 --> “KEYCODE_CLEAR”
29 --> “KEYCODE_A”
30 --> “KEYCODE_B”
31 --> “KEYCODE_C”
32 --> “KEYCODE_D”
33 --> “KEYCODE_E”
34 --> “KEYCODE_F”
35 --> “KEYCODE_G”
36 --> “KEYCODE_H”
37 --> “KEYCODE_I”
38 --> “KEYCODE_J”
39 --> “KEYCODE_K”
40 --> “KEYCODE_L”
41 --> “KEYCODE_M”
42 --> “KEYCODE_N”
43 --> “KEYCODE_O”
44 --> “KEYCODE_P”
45 --> “KEYCODE_Q”
46 --> “KEYCODE_R”
47 --> “KEYCODE_S”
48 --> “KEYCODE_T”
49 --> “KEYCODE_U”
50 --> “KEYCODE_V”
51 --> “KEYCODE_W”
52 --> “KEYCODE_X”
53 --> “KEYCODE_Y”
54 --> “KEYCODE_Z”
55 --> “KEYCODE_COMMA”
56 --> “KEYCODE_PERIOD”
57 --> “KEYCODE_ALT_LEFT”
58 --> “KEYCODE_ALT_RIGHT”
59 --> “KEYCODE_SHIFT_LEFT”
60 --> “KEYCODE_SHIFT_RIGHT”
61 --> “KEYCODE_TAB”
62 --> “KEYCODE_SPACE”
63 --> “KEYCODE_SYM”
64 --> “KEYCODE_EXPLORER”
65 --> “KEYCODE_ENVELOPE”
66 --> “KEYCODE_ENTER”
67 --> “KEYCODE_DEL”
68 --> “KEYCODE_GRAVE”
69 --> “KEYCODE_MINUS”
70 --> “KEYCODE_EQUALS”
71 --> “KEYCODE_LEFT_BRACKET”
72 --> “KEYCODE_RIGHT_BRACKET”
73 --> “KEYCODE_BACKSLASH”
74 --> “KEYCODE_SEMICOLON”
75 --> “KEYCODE_APOSTROPHE”
76 --> “KEYCODE_SLASH”
77 --> “KEYCODE_AT”
78 --> “KEYCODE_NUM”
79 --> “KEYCODE_HEADSETHOOK”
80 --> “KEYCODE_FOCUS”
81 --> “KEYCODE_PLUS”
82 --> “KEYCODE_MENU”
83 --> “KEYCODE_NOTIFICATION”
84 --> “KEYCODE_SEARCH”
85 --> "TAG_LAST_KEYCODE
附录2:主进程中添加悬浮窗的方法
public void createFloatView()
{
final Button btn_floatView = new Button(getApplicationContext());
btn_floatView.setText("悬浮窗");
final WindowManager wm = (WindowManager) getApplicationContext().getSystemService(
Context.WINDOW_SERVICE);
final WindowManager.LayoutParams params = new WindowManager.LayoutParams();
// 设置window type
params.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT;
/*
* 如果设置为params.type = WindowManager.LayoutParams.TYPE_PHONE; 那么优先级会降低一些,
* 即拉下通知栏不可见
*/
params.format = PixelFormat.RGBA_8888; // 设置图片格式,效果为背景透明
// 设置Window flag
params.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
| WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
/*
* 下面的flags属性的效果形同“锁定”。 悬浮窗不可触摸,不接受任何事件,同时不影响后面的事件响应。
* wmParams.flags=LayoutParams.FLAG_NOT_TOUCH_MODAL |
* LayoutParams.FLAG_NOT_FOCUSABLE | LayoutParams.FLAG_NOT_TOUCHABLE;
*/
// 设置悬浮窗的长得宽
params.width = 200;
params.height = 200;
Button bt7=findViewById(R.id.mainButton6);
bt7.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View p1)
{wm.removeView(btn_floatView);
// TODO: Implement this method
}
});
// 设置悬浮窗的Touch监听
btn_floatView.setOnTouchListener(new OnTouchListener()
{
int lastX, lastY;
int paramX, paramY;
public boolean onTouch(View v, MotionEvent event)
{
switch (event.getAction())
{
case MotionEvent.ACTION_DOWN:
lastX = (int) event.getRawX();
lastY = (int) event.getRawY();
paramX = params.x;
paramY = params.y;
break;
case MotionEvent.ACTION_MOVE:
int dx = (int) event.getRawX() - lastX;
int dy = (int) event.getRawY() - lastY;
params.x = paramX + dx;
params.y = paramY + dy;
// 更新悬浮窗位置
wm.updateViewLayout(btn_floatView, params);
break;
}
return true;
}
});
//......
//添加到WindowManager里面
wm.addView(btn_floatView, params);
boolean isAdded = true;
}