第三天:手机归属地
安卓DEMO里面的示例,我應該把安卓DEMO里面的示例看過一遍1. 通過網絡獲取歸屬地 缺陷: 網絡2. 本地的數據庫 (有一個電話號碼的歸屬地)
sqlite的數據庫 android下的數據庫 .db
一定要有一張 android_metadata 程序 開發中有一些大的素材 和資源文件
1. res目錄建立一個文件夾 raw 在R文件中生成一個id的引用
最好推薦存放一些小的資源 幾十k 幾百K 2. assets 資產目錄
不會把里面的內容在R 文件中生成一個引用
assets 不推薦我們存在1M 文件
appt 打包工具可能出現問題.3. javame
把大的資源文件放置在src目錄下 通過類加載器的方式 獲取這個資源文件
導致我們應用程序的體積非常大.4. 程序的主apk很小 素材文件 資源文件從服務器上下載
sdcard rom
一般游戲軟件 大的oa軟件
地圖軟件 離線地體20~100M~ 1G 菜譜程序: 我們知道在子線程不能對UI進行更改,為什么Progress可以不斷的更新進度呢?
因為底層它已經實現是通過Handler更新的,你可以看源碼,而且可以在子線程里面
寫dismiss,其實底層就是顯示:public void dismiss() {if (Thread.currentThread() != mUiThread) {mHandler.post(mDismissAction);} else {mDismissAction.run();}}
如果不是主線和就告訴Handler去結束它,如果是主線程直接結束。Message中what和obj區別?學會從API demo里面找資源,先從上面的一些字符也就是資源文件找--》布局文件--》JAVA文件。
非常好的思路方法,要多學習方法。有一個非常好的晃動動畫,要學習。沒有使用類的成員變量直接做成靜態方法。發個東西:
File-based resource names must contain only lowercase a-z, 0-9, or _.
安卓中的XML文件只能是小寫字母數字和下劃線。又是一個教訓。子線程中不能改動主界面。
例如子線程里面不能調用一個Toast,因為它改變了主界面。操 ,太坑爹了。
記住了,所有在子線程里操作界面發生錯誤都是這句話:
Can't create handler inside thread that has not called Looper.prepare()
pd.setTitle("提示");
pd.setIcon(R.drawable.icon5);
pd.setCancelable(false);
pd.setMessage("正在下載數據庫");
pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
pd.show();//pd的這些操作放在子線程里面就是Can't create handler inside thread that has not called Looper.prepare()
new Thread(){public void run() {//提示用戶下載數據庫String dbUrl = getResources().getString(R.string.addressdburl);try {DownloadApkTask.download(dbUrl, Environment.getExternalStorageDirectory()+"/address.db", pd);//下載結束 關閉pd,但是它可以放這,雖然操作了界面顯示 ,不過底層已經處理過了,它是先交給主線程處理的。pd.dismiss();
// Toast.makeText(AtoolsActivity.this, "下載成功", 0).show();
// Intent intent = new Intent(AtoolsActivity.this,QueryNumberActivity.class);
// startActivity(intent);Message msg = new Message();msg.what = SUCCESS;handler.sendMessage(msg);} catch (Exception e) {e.printStackTrace();pd.dismiss();//你把顯示提示信息放在這,必死無疑。因為你在子線程里面想要改變界面
// Message msg = new Message();msg.what = ERROR;handler.sendMessage(msg);}};}.start();左右晃動的動畫(安卓DEMO里面的示例,我應該把安卓DEMO里面的示例看過一遍):
sharke.xml.
<translate xmlns:android="http://schemas.android.com/apk/res/android"android:duration="1000"android:fromXDelta="0"android:interpolator="@anim/cycle_7"android:toXDelta="10" />
cycle_7.xml---也就是說它可以左右搖動7次。
<cycleInterpolator xmlns:android="http://schemas.android.com/apk/res/android"android:cycles="7" />
SDK對Interpolator的描述是:
An interpolator defines the rate of change of an animation.This allows the basic animation effects (alpha, scale, translate, rotate)to be accelerated, decelerated, repeated, etc。簡而言之Interpolator就是一個“變化率”,一個基本動畫的“變化率”。比如:從A到B的一個平移動畫,移動,當然后速度的快慢,那么從A到B可以是勻速、勻加速、勻減速、變速完成這段距離。假設距離為S,時間為t,速度為v,都知道S=v*t。 1.手機號碼 11位 13 15 18 + 9位數字
135 xxxx xxxx
136 xx
^1[3458]\d{9}$
這個就是用來匹配手機的,開頭為1,第二位為3458任意一位,后面跟九個整數。
在JAVA中這些\要轉義一下。
String pattern = "^1[3458]\\d{9}$"; 2.固定電話
7位 8位
本地電話 10位 3位區號 +7位的電話號碼
11位 4位區號 + 7位的電話號碼 3位的區號 +8位的電話號碼
12位 4位區號 +8位的電話號碼 動態獲取別人手機號碼歸屬地:
1.必須要有別人程序的源代碼.
2.不修改別人源代碼, 判斷獲取當前手機狀態, 呼叫狀態顯示出來號碼的歸屬地
第一件事情:判斷手機的狀態
創建一個android下的服務 , 長期后臺運行,不容易被系統回收.
第二件事情:得到電話號碼歸屬地 顯示到手機窗體.其實這種是在后臺開了一個服務,后臺一直監控著通話狀態,如果出現接通的時間就把
那個桌面的小窗體顯示出來。QQ,360,金山都是這樣做的。Registers a listener object to receive notification of changes in specified telephony states. To register a listener, pass a PhoneStateListener and specify at least one telephony state ofinterest in the events argument. At registration, and when a specified telephony state changes,the telephony manager invokes the appropriate callback method on the listener object and passes the current (udpated) values. To unregister a listener, pass the listener object and set the events argument to LISTEN_NONE (0).在Service里面也能打印出來
Toast.makeText(getApplicationContext(), address + "address", 1).show();在后臺看服務也可以看到圖標的,這個圖標就是service的圖標 。其實那些安全的浮窗一樣的圖標,其實跟Toast差不多,所以我們可以仿寫一個圖標 。
看看Toast的源代碼 。
太神奇了,往WindowsManager上綁定一個View即可。
//得到桌面管理對象
WindowManager windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
windowManager.addView(tv, params);
通過WindowManager這個對象可以把任何View放到桌面上,太強大了吧。選擇桌面顯示的View的風格。ImageView一些東西?src background ScaleType 區別?
其實ImageView與HTML下的DIV一樣,其實所有的控件都可以看成HTML下的
DIV,你設置個SRC只是把它內部顯示的那一部分填充了,所以有了padding
這個屬性,如果你填寫background把整個都填充了。
而ScaleTypeScaleType的值分別代表的意義: ImageView是Android中的基礎圖片顯示控件,該控件有個重要的屬性是ScaleType,該屬性用以表示顯示圖片的方式,共有8種取值ScaleType.CENTER::圖片大小為原始大小,如果圖片大小大于ImageView控件,則截取圖片中間部分,若小于,則直接將圖片居中顯示。ScaleType.CENTER_CROP:將圖片等比例縮放,讓圖像的短邊與ImageView的邊長度相同,即不能留有空白,縮放后截取中間部分進行顯示。ScaleType.CENTER_INSIDE:將圖片大小大于ImageView的圖片進行等比例縮小,直到整幅圖能夠居中顯示在ImageView中,小于ImageView的圖片不變,直接居中顯示。ScaleType.FIT_CENTER:ImageView的默認狀態,大圖等比例縮小,使整幅圖能夠居中顯示在ImageView中,小圖等比例放大,同樣要整體居中顯示在ImageView中。ScaleType.FIT_END:縮放方式同FIT_CENTER,只是將圖片顯示在右方或下方,而不是居中。ScaleType.FIT_START:縮放方式同FIT_CENTER,只是將圖片顯示在左方或上方,而不是居中。ScaleType.FIT_XY:將圖片非等比例縮放到大小與ImageView相同。即填充整個ImageView.ScaleType.MATRIX:是根據一個3x3的矩陣對其中圖片進行縮放任何一個View都有一個叫做layout的方法。非常好用。
tv_drag_view.layout(tv_drag_view.getLeft(), 260, tv_drag_view.getRight(), 280);
l Left position, relative to parent
t Top position, relative to parent
r Right position, relative to parent
b Bottom position, relative to parent//為布局中的某個控件顯式指定其位置。
android.widget.RelativeLayout.LayoutParams layoutParams = (android.widget.RelativeLayout.LayoutParams) iv_drag_view.getLayoutParams();
layoutParams.leftMargin = x;
layoutParams.topMargin = y;
iv_drag_view.setLayoutParams(layoutParams);注意:Service也繼承了Context,
Service extends ContextWrapper extends Context.
四大組件中兩個組件都有繼承Context,另外兩個比較獨立沒有繼承。面試題:
點擊和觸摸的區別是什么?點擊: 一組動作的集合(分為三步) 手指按下著按鈕 手指要在按鈕停留一段時間 手指離開按鈕,又根據停留的長短
有setOnclick 和 setOnLongClick觸摸: 手指一挨著屏幕 手指移動 手指離開屏幕又有一個驚天的東西,你在onCreate里面執行一些關于界面的操作,可能
這個時間這個界面并沒有生成,很可能那個VIEW在生成的過程中,所以這時間
你就要對它的界面做出改變肯定可能會出問題。所以你可以在onResum()方法中,
表示它已經生成了,并且獲取焦點了。改變activity的背景色。就可以把它做成半透明的效果。
在布局文件里面把整個布局的背景色調制了android:background="#cc000000"
就成了半透明效果。其實一個activity就相當于一個頁面或者一個DIV.響一聲電話:在TelephonyManager.CALL_STATE_RINGING://鈴響時間
獲取當前系統時間,然后在TelephonyManager.CALL_STATE_IDLE://空閑
時間獲取當前系統時間,兩個相減,如果小于多少秒就認為是響一聲電話。操,又發個自己不知道,原來手機那些可以直接點擊的文字,不是一個TextView綁定的
的監聽事件,而是一個Button加上了背景色,操 ,太坑爹了。為什么ListView在拖動的時間是黑色,而靜止時間是自己的顏色是因為
ListView的緩存。只需一個配置即可。在這個ListView里面加上它即可。
android:cacheColorHint="@android:color/transparent"ArrayAdapter對數據做了緩存,不能被那個方法及時更新。所以還是要自定義
Adapter.上下文菜單 。菜單有三種。execSQL()用法。
Execute a single SQL statement that is not a query.
For example, CREATE TABLE, DELETE, INSERT, etc.
Multiple statements separated by ;s are not supported. it takes a write lock。想要查詢用rawQuery();給按鈕加個背景,是個State List Selector選擇器。果然不一樣了,跟一文本一樣。
<Button android:id="@+id/bt_add_black_number"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginLeft="20dip"android:background="@drawable/button_selector"android:text="添加"android:textColor="#FFF8F8F8"android:textSize="20sp"/>//忘記整這句話,下面東西全部空針異常
setContentView(R.layout.call_sms_safe);最厲害的,我們在ListView里添加過以后,想要異步刷新,
即頁面不改變,但是數據改變了。其實就是安卓 中的ajax。
dao.insert(numString);
//此時你肯定想要通知ListView刷新數據。
// 讓數據適配器通知listview更新數據 ,相當于異步 刷新 。
numbers = dao.findAll(); //你也要先得到最新的數據。
adapter.notifyDataSetChanged();
Notifies the attached View that the underlying data has been changed
and it should refresh itself.上下文菜單 :
一、注冊
// 給listview注冊上下文菜單
registerForContextMenu(lv_call_sms_safe);
二、配置文件
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" ><item android:id="@+id/update_number" android:title="更改黑名單號碼"/><item android:id="@+id/deltel_number" android:title="刪除黑名單號碼"/>
</menu>
三、覆蓋方法
/*** 創建上下文菜單 */
@Override
public void onCreateContextMenu(ContextMenu menu, View v,ContextMenuInfo menuInfo) {super.onCreateContextMenu(menu, v, menuInfo);//其實這個是獲得menu的那個充氣的東西,與View略有不同MenuInflater inflater = getMenuInflater();//把這個布局文件的View給吹起來inflater.inflate(R.menu.context_menu, menu);
}
/*** 為下下文菜單寫監聽事件*/
@Override
public boolean onContextItemSelected(MenuItem item) {AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();switch (item.getItemId()) {case R.id.update_number:break;case R.id.deltel_number://當前條目的ID。int id = (int) info.id;String num = numbers.get(id);dao.delete(num);//重新獲取新的代碼 numbers = dao.findAll();//通知最新的adapter.notifyDataSetChanged();break;}return false;
}
總結
- 上一篇: 微信引流专家 v1.1.2.1
- 下一篇: matlab 医学断层图像,利用MATL