Android 開發知識點總結

hogen發表於2018-01-02

很可能下一份工作就不是從事 Android 了,現在的確不在做了[微笑],在做 Android 開發的這段時期裡還是總結了很多的基礎知識的,所以後續還是會有幾篇會一一上傳。慚愧,本人目前還是菜B一枚,還沒有達到研究原始碼發表一些牛掰爾爾,無論是部落格還是其它的筆記都是一些基礎的內容知識點,我總是相信再高深的知識如果基礎不牢也沒法去擁有掌握,如下羅列都是自己在開發中遇到的一些瑣屑知識點,是寫給自己看的,當然很多都可以從網上查到,我只不過做了個歸納、整理,方便查閱。如果看客覺得有用,不用客氣,覺得沒用,也不要咒罵,抱怨!

直接複製專案需要注意:

  • 要改動的地方
    • 專案名字
    • 應用包名
    • 重新匯入R檔案

廣播(BroadcastReceiver)

  • 是繼承自 BroadcastReceiver 的, 並重寫了父類的 onReceive()方法

  • 動態註冊的廣播接收器一定都要取消註冊才行

  • 傳送有序廣播 sendOrderedBroadcast(intent, null);

  • 既然已經獲得了接收廣播的優先權,那麼 MyBroadcastReceiver 就可以選擇是否允許廣 播繼續傳遞了 abortBroadcast();

  • 為了能夠簡單地解決廣播的安全性問題,Android引入了一套本地廣播機制,使用這個 機制發出的廣播只能夠在應用程式的內部進行傳遞, 並且廣播接收器也只能接收來自本應用 程式發出的廣播,這樣所有的安全性問題就都不存在了

      @Override
      protected void onCreate(Bundle savedInstanceState) {
      	super.onCreate(savedInstanceState);
      	setContentView(R.layout.activity_main);
      	localBroadcastManager = LocalBroadcastManager.getInstance(this);
      	
      	Button button = (Button) findViewById(R.id.button);
      	button.setOnClickListener(new OnClickListener() {
      		@Override
      		public void onClick(View v) {
      			Intent intent = new Intent("com.excel.localbroadcast.LOCAL_BROADCAST");
      			localBroadcastManager.sendBroadcast(intent);
      		}
      	});
      	intentFilter = new IntentFilter();
      	intentFilter.addAction("com.excel.localbroadcast.LOCAL_BROADCAST");
      	localReceiver = new LocalReceiver();
      	localBroadcastManager.registerReceiver(localReceiver, intentFilter);
      }
    複製程式碼

另外還有一點需要說明,本地廣播是無法通過靜態註冊的方式來接收的,其實這也完全可以理解,因為靜態註冊主要就是為了讓程式在未啟動的情況下也能收到廣播,而傳送本地廣播時,我們的程式肯定是已經啟動了,因此也完全不需要使用靜態註冊的功能。使用本地廣播的幾點優勢。

  1. 可以明確地知道正在傳送的廣播不會離開我們的程式, 因此不需要擔心機密資料洩 漏的問題。
  1. 其他的程式無法將廣播傳送到我們程式的內部, 因此不需要擔心會有安全漏洞的隱 患。
  2. 傳送本地廣播比起傳送系統全域性廣播將會更加高效。

Android中主要提供了三種方法用於得到 SharedPreferences物件

  • Context 類中的 getSharedPreferences() 方法

      SharedPreferences sp = context.getSharedPreferences("ip", Context.MODE_PRIVATE);
    複製程式碼
  • Activity類中的 getPreferences() 方法

      SharedPreferences sp = getSharedPreferences("ip", MODE_PRIVATE);
    複製程式碼
  • PreferenceManager 類中的 getDefaultSharedPreferences() 方法

      button.setOnClickListener(new OnClickListener() {
      	@Override
      	public void onClick(View v) {
      		SharedPreferences.Editor editor = getSharedPreferences("data",MODE_PRIVATE).edit();
      		editor.putString("name", "Tom");
      		editor.putInt("age", 28);
      		editor.putBoolean("married", false);
      		editor.commit();
      	}
      });
    複製程式碼

SQLite建立表

create table Book (
id integer primary key autoincrement,
author text,
price real,
pages integer,
name text)
複製程式碼

integer 表示整型,real表示浮點型,text 表示文字型別,blob 表示二進位制型別

使用cmd命令檢視錶

  • 在環境變數裡配置plant-tools路徑
  • 開啟cmd,輸入adb shell,進入手機儲存目錄
  • cd /data/data/com.lhg.sqlitedatabase/databases路徑下
  • sqlite3 資料庫名.db -->檢視資料庫
  • .table -->檢視資料庫中所有表
  • pragma table_info(表名) -->檢視錶的資料結構

輸入.mode line命令切換顯示模式,然後重新執行pragma命令

  • .schema -->檢視建表語句
  • .exit -->退出

使用SQL基本語句運算元據庫

	public void insert() {
		// 如果資料庫不存在,先建立資料庫,再獲取可讀可寫的資料庫物件,如果資料庫存在,就直接開啟
		db.execSQL("insert into person(name, salary,phone)values(?,?,?)", new Object[] { "張三", "5000", 1384700 });
		db.execSQL("insert into person(name, salary,phone)values(?,?,?)", new Object[] { "李四", 200, 1872093 });
		db.execSQL("insert into person(name, salary,phone)values(?,?,?)", new Object[] { "王五", 10000, 1322093 });
		db.execSQL("insert into person(name, salary,phone)values(?,?,?)", new Object[] { "李毅", 100, 1312093 });
	}

	public void delete() {
		db.execSQL("delete from person where name=?", new Object[] { "張三" });
	}

	public void update() {
		db.execSQL("update person set salary=? where name=?", new Object[] { 20000, "王五" });
	}

	public void select() {
		Cursor cursor = db.rawQuery("select * from person", null);
		while (cursor.moveToNext()) {
			String name = cursor.getString(cursor.getColumnIndex("name"));
			String salary = cursor.getString(cursor.getColumnIndex("salary"));
			String phone = cursor.getString(cursor.getColumnIndex("phone"));
			System.out.println(name + "--->" + salary + "-->" + phone);
		}
	}
複製程式碼

使用android提供的api運算元據庫

	// 使用Api插入資料庫
	public void insertApi() {
		ContentValues values = new ContentValues();
		// 第一個屬性必須和資料庫中欄位對應
		values.put("name", "劉文勇");
		values.put("salary", 2500);
		values.put("phone", 110);
		db.insert("person", null, values);
	}

	// 使用api刪改資料庫
	public void deleteApi() {
		// 如果資料庫中有多個name相同的物件,可以用以下方式來指定,
		int i = db.delete("person", "name=? and _id=?", new String[] { "張三", "3" });
		System.out.println(i);
	}

	public void updateApi() {
		ContentValues values = new ContentValues();
		values.put("phone", 119);
		int i = db.update("person", values, "name=?", new String[] { "張三" });
		System.out.println(i);
	}

	public void selectApi() {
		Cursor cursor = db.query("person", null, null, null, null, null, null);
		while (cursor.moveToNext()) {
			String name = cursor.getString(cursor.getColumnIndex("name"));
			String salary = cursor.getString(cursor.getColumnIndex("salary"));
			String phone = cursor.getString(cursor.getColumnIndex("phone"));
			System.out.println(name + "-->" + salary + "-->" + phone);
		}
	}
複製程式碼

事務,經典例子,銀行轉賬

public void transaction() {
	try {
		// 開啟事務
		db.beginTransaction();
		ContentValues values = new ContentValues();
		values.put("salary", 9000);
		db.update("person", values, "name=?", new String[] { "李四" });

		values.clear();// 建議寫上
		values.put("salary", 6000);
		db.update("person", values, "name=?", new String[] { "楊文" });
		// int i = 3/0;//事務不執行
		// 設定 事務執行成功
		db.setTransactionSuccessful();
	} finally {
		// 關閉事務,同時提交,如果已經設定事務執行成功,那麼sql語句就生效了,反之,sql語句回滾
		db.endTransaction();
	}
}
複製程式碼

裝載佈局的三種方式

View view = getLayoutInflater().inflate(R.layout.add_black_number, null);
View view =LayoutInflater.from(this).inflate(R.layout.add_black_number, null);
View view = View.inflate(this, R.layout.add_black_number,null);
複製程式碼

訪問assets目錄下的檔案的路徑寫法(比如資料庫)

//路徑
private static final String PATH="data/data/com.excel.mobileSafe/files/address.db"
//拿到資料庫物件
SQLiteDatabase database = SQLiteDatabase.openDatabase(PATH,null,SQLiteDatabase.OPEN_READONLY)
複製程式碼

ListView介面卡通過構造方法關聯MainActivity

private List<String> mData;
private LayoutInflater mInflater;
public  ListViewAdapter(Context context,List<String> mData) {
	// TODO Auto-generated constructor stub
	this.mData = mData;
	mInflater = LayoutInflater.from(context);
}
複製程式碼

TextView、EditText預設是不可以點選的,設定屬性

android:clickable="true"
複製程式碼

兩個介面切換的動畫

overridePendingTransition()
複製程式碼

設定圖片沒有背景

android:background="@null"
複製程式碼

把RadioButton左邊的小圓圈按鈕去掉

android:button="@null"
複製程式碼

ListView無選擇效果

android:listSelector="@null"
複製程式碼

聯絡人URI

  • ContactsContract.Contacts.CONTENT_URI:管理聯絡人的URI
  • ContactsContract.CommonDataKinds.Phone.CONTENT_URI:管理聯絡人電話的URI
  • ContactsContract.CommonDataKinds.Email.CONTENT_URI:管理聯絡人email的URI
  • String contactId = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID))//獲取聯絡人ID
  • String name = cursor.getString(cursor.getColumn(ContactsContract.Contacts.DISPLAY_NAME))//獲取聯絡人姓名

打電話

Intent intent = new Intent();
//設定動作,打電話
intent.setAction(Intent.ACTION_CALL);
intent.setData(Uri.parse("tel:" + phone));
//把意圖告訴系統
startActivity(intent);
//設定許可權
<uses-permission android:name= "android.permission.CALL_PHONE"/>
複製程式碼

分享文字

Intent intent = new Intent();
intent.setAction(Intent.ACTION_SEND);
intent.setType("text/plain");//image/jpeg
intent.putExtra(Intent.EXTRA_TEXT, "麼麼噠!");
startActivity(intent);
複製程式碼

在當前分享文字activity中配置 <action android:name="android.intent.action.SEND" /><data android:mimeType="text/plain" />

為ViewPager設定監聽,用addOn....

viewPager.addOnPageChangeListener(new OnPageChangeListener() {
		@Override
		public void onPageSelected(int position) {
			System.out.println("當前條目"+position);
		}
		
		@Override
		public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
			// TODO Auto-generated method stub		
		}
		
		@Override
		public void onPageScrollStateChanged(int state) {
			// TODO Auto-generated method stub
		}
	});
複製程式碼

狀態選擇器(比如ViewPager 時螢幕下方的小圓點的狀態) selector_dots

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
    <!-- 如果狀態可用(在當前頁),則為白色 -->
	<item android:state_enabled="true"  android:drawable="@drawable/dot_focus"/>
	<item android:drawable="@drawable/dot_unfocus"/>
</selector>
複製程式碼

dot_focus.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval" >
	<solid android:color="#ffffff"/>
</shape>	
複製程式碼

dot_unfocus.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval" >
	<solid android:color="#aa000000"/>
</shape>
複製程式碼

在程式碼中繪製小圓點

private void initDots() {
	for (int i = 0; i < mContent.size(); i++) {
		View view = new View(this);// 用於顯示小圓點
		LayoutParams params = new LayoutParams(10, 10);// 小圓點的大小
		view.setLayoutParams(params);
		if (i != 0) {
			params.leftMargin = 7;// 設定每個圓點的間隔
		}
		view.setBackgroundResource(R.drawable.selector_dot);
		dots.addView(view);// 把小圓點新增到先行佈局裡去
	}
}
複製程式碼

更新小圓點位置

private void updateDots() {
	int currentItem = viewPager.getCurrentItem() % mContent.size();
	for (int i = 0; i < dots.getChildCount(); i++) {
		dots.getChildAt(i).setEnabled(i == currentItem);
	}
}
複製程式碼

Android如何設定定時每十分鐘執行一次任務

private Handler handler  = new Handler(){
	public void handleMessage(Message msg) {
		super.handleMessage(msg);
		if(msg.waht == 1){
			//todo something....
		}
	}
};
new Timer(true).schedule(new TimerTask() {
		@Override
		public void run() {
			Message msg = Message.obtain();
		  	msg.what = 1;
		  	handler.sendMessage(msg);
		}
	}, 200, 1000);
複製程式碼

ListView在程式碼中動態設定背景、滾動條

listView.setBackgroundResource(R.drawable.btn_default_transparent_normal);//設定背景
listView.setVerticalScrollBarEnabled(false);//設定滾動條是否可見
android:scrollbars="none" //ListView在XML中設定滾動條不可見
複製程式碼

editText限制輸入內容的4種方法

<!-- 方法1 xml中配置inputType。 -->
<EditText
    android:id="@+id/et1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:hint="只限數字(xml中 配置inputType)"
    android:inputType="number" />

<!-- 方法2 xml中配置digits -->
<EditText
    android:id="@+id/et2"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:digits=" .@~-,:*?!#/\\=+?^;%$()[]{}|`<>&"'_0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLIMNOPQRSTUVWXYZ"
    android:hint="只限自定義特殊字元(xml中  配置digits)" />

//方式3:java中使用setKeyListener,新增DigitsKeyListener。
//private final static String ET3_DIGITS = "abcd";
//et3.setKeyListener(DigitsKeyListener.getInstance(ET3_DIGITS));
<EditText
    android:id="@+id/et3"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:hint="只限abcd(java中使用addTextChangedListener)" />

//方法4:java中使用setFilters,新增InputFilter。
<EditText
    android:id="@+id/et4"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:hint="只限wxyz(java中使用setFilters)" />
	
private final static String ET4_DIGITS = "wxyz";
et4.setFilters(new InputFilter[] {new InputFilter() {
	/**source:你即將輸入的字元序列
	 * start:預設為0,  end:你即將輸入的字元序列的長度
	 * dest:當前EditText顯示的內容
	 * 經測試dstart和dend 總是相等,都表示輸入前游標所在位置
	 */
	@Override
	public CharSequence filter(CharSequence source, int start, int end,
			Spanned dest, int dstart, int dend) {			

        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < source.length(); i++) {
            if (ET4_DIGITS.indexOf(source.charAt(i)) >= 0) {
                sb.append(source.charAt(i));
            }
        }
        return sb;
	}
}});
複製程式碼

使用程式碼鎖定橫豎屏

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT)
複製程式碼

橫豎屏切換時不呼叫各個生命週期

android:configChanges="orientation|keyboardHidden|ScreenSize"
複製程式碼

或是在AndroidManifest.xml中配置

android:screenOrientation="landscape"是限制此頁面橫屏顯示,
android:screenOrientation="portrait"是限制此頁面數豎屏顯示。 
複製程式碼

Activity的View介面全屏

<!--隱藏標題欄-->
requestWindowFeature(Window.FEATURE_NO_TITLE); 
<!--隱藏訊號欄--> 
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);  
複製程式碼

用程式生成的祕鑰得到API

用程式生成的祕鑰得到API

全域性去掉標題欄

 <style name="AppTheme" parent="AppBaseTheme">
    <item name="android:windowNoTitle">true</item>
 </style>
複製程式碼

EditText屬性操作

et.requestFocus(); //請求獲取焦點
et.clearFocus(); //清除焦點
et.setSelectAllOnFocus(true);//獲得焦點時全選文字
et.setCursorVisible(false);//設定游標不顯示
et.setSelection(int index);//設定游標到指定位置,當內容過多時,可通過該設定讓內容顯示在螢幕上
複製程式碼

EditText設定焦點監聽

editText.setOnFocusChangeListener(new OnFocusChangeListener() {
		@Override
		public void onFocusChange(View v, boolean hasFocus) {
			if (hasFocus) {
				//得到焦點
			}else {
				//失去焦點
			}
		}
	});
複製程式碼

EditText對文字的監聽

editText.addTextChangedListener(new TextWatcher() {
		@Override
		public void onTextChanged(CharSequence s, int start, int before, int count) {
		}

		@Override
		public void beforeTextChanged(CharSequence s, int start, int count, int after) {
		}

		@Override
		public void afterTextChanged(Editable s) {
			
		}
	});
複製程式碼

對android軟鍵盤的操作

在XML佈局中設定不同android:imeOptions時軟鍵盤迴車鍵顯示的不同效果

1.android:imeOptions=”actionDone”	軟鍵盤右下角顯示”完成
2.android:imeOptions=”actionGo”		軟鍵盤右下角顯示”前往
3.android:imeOptions=”actionNext”	軟鍵盤右下角顯示”下一項
4.android:imeOptions=”actionPrevious”	軟鍵盤右下角顯示"上一項"
5.android:imeOptions=”actionSearch”		軟鍵盤右下角顯示"搜尋"
6.android:imeOptions="actionSend"		軟鍵盤右下角顯示"傳送"
複製程式碼

要給EditText設定inputType或singleLine屬性

對軟鍵盤設定監聽

editText.setOnEditorActionListener(new OnEditorActionListener() {
		@Override
		public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
			//獲得一個輸入法管理器物件
		    inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
			switch (actionId) {
			case EditorInfo.IME_ACTION_SEARCH:
				//隱藏軟鍵盤
				inputMethodManager.hideSoftInputFromWindow(v.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
				//執行其它操作
				break;
			case EditorInfo.IME_ACTION_NEXT:
				//隱藏軟鍵盤
				inputMethodManager.hideSoftInputFromWindow(v.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
				//執行其它操作
				break;
			........
			
			default:
				break;
			}
			return true;
		}
	});
複製程式碼

SimpleAdapter 用法

public class MainActivity extends Activity {
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		ListView listView = (ListView) findViewById(R.id.listView1);
		//第四個引數內容要和Map的鍵名一致
		SimpleAdapter adapter = new SimpleAdapter(this, getData(), R.layout.listview_item, new String[]{"photo","name"}, new int[]{R.id.iv_photo,R.id.tv_name});
		listView.setAdapter(adapter);
	}

	private List<Map<String, Object>> getData() {
		List<Map<String, Object>> data = new ArrayList<Map<String, Object>>();

		Map<String, Object> map1 = new HashMap<String, Object>();
		map1.put("photo", R.drawable.img1);
		map1.put("name", "林洪川");
		data.add(map1);

		Map<String, Object> map2 = new HashMap<String, Object>();
		map2.put("photo", R.drawable.img2);
		map2.put("name", "劉和廣");
		data.add(map2);
		.........
		
		return data;
	}
}
複製程式碼

點選Button彈出對話方塊

public void btnClick(View view){
	AlertDialog.Builder builder = new Builder(this);
	builder.setIcon(...);
	builder.setTitle(...);
	buildr.setMessage(...);
	builder.setPositiveButton..
	builder.setNegativeButton..
	AlertDialog dialog = builder.create();//使用建立器,生成一個對話方塊物件
	dialog.show();
	//如下兩句可以修改確定取消按鈕的顏色,必須寫dialog.show()後面
	dialog.getButton(dialog.BUTTON_NEGATIVE).setTextColor(Color.RED);
    dialog.getButton(dialog.BUTTON_POSITIVE).setTextColor(Color.BLUE);
}
複製程式碼

從系統相簿中選擇圖片並壓縮大小顯示在ImageView中

// 得到圖片的內容uri
Uri uri = data.getData();
// 相簿中圖片的資料引數
String[] picPathColumn = { MediaStore.Images.Media.DATA };
Cursor cursor = getContentResolver().query(uri, picPathColumn, null, null, null);
cursor.moveToFirst();
int columnIndex = cursor.getColumnIndex(picPathColumn[0]);
picturePath = cursor.getString(columnIndex);
// 把圖片路徑顯示到TextView中
tvPhotoPath.setText(picturePath);
ivPhoto.setImageBitmap(compressImg());

public Bitmap compressImg(){
	BitmapFactory.Options options = new BitmapFactory.Options();
	options.inJustDecodeBounds = true;//只載入圖片大小
	BitmapFactory.decodeFile(picturePath, options);
	//縮放圖片  18行
	double ratio = Math.max(options.outWidth*1.0d/1024f,options.outHeight*1.0d/1024f);
	options.inSampleSize = (int) Math.ceil(ratio);
	options.inJustDecodeBounds = false;//載入圖片
	Bitmap bitmap = BitmapFactory.decodeFile(picturePath,options);
	return bitmap;
}
//計算縮放比例(可替換18行)
Display display = getWindowManager().getDefaultDisplay();
DisplayMetrics displayMetrics = new DisplayMetrics();
display.getMetrics(displayMetrics);
//螢幕寬高
int screenWidth = displayMetrics.widthPixels;
int screenHeight = displayMetrics.heightPixels;
//圖片寬高
int imageWidth = options.outWidth;
int imageHeight = options.outHeight;
int widthScale = imageWidth/screenWidth;
int heightScale = imageHeight/screenHeight;
int scale = widthScale > heightScale? widthScale:heightScale;
複製程式碼

drawable 轉 bitmap

public static Bitmap drawable2bitmap(Drawable drawable) {
    //如果本身就是一個包裝了bitmap的drawable物件,直接從現有的Drawable中取出Bitmap:
    if (drawable instanceof BitmapDrawable) {
        return ((BitmapDrawable) drawable).getBitmap();
    }
    Bitmap bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888);
    //注意,下面三行程式碼要用到,否在在View或者surfaceview裡的canvas.drawBitmap會看不到圖
    Canvas canvas = new Canvas(bitmap);
    drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
    drawable.draw(canvas);
    return bitmap;
}
複製程式碼

bitmap 轉 drawable

public static Drawable bitmap2drawable(Context context, Bitmap bitmap){
    return new BitmapDrawable(context.getResources(),bitmap);
}
複製程式碼

給 LinearLayout 加分割線(一起使用才有效果)

android:divider="@drawable/divider"
android:showDividers="middle"
複製程式碼

Notification 基本使用(普通服務)

//點選通知進入通知詳情頁
Intent intent = new Intent(this,NotificationActivity.class);
PendingIntent pi = PendingIntent.getActivity(this,0,intent,0);
//使用support-v4包中NotificationCompat類在所有Android系統正常工作
Notification notification = new NotificationCompat.Builder(this)
        .setContentTitle("2016年12月24日星期五")
        .setContentText("今天天氣陰天,會下雨,麼麼噠")
        .setWhen(System.currentTimeMillis())
        .setSmallIcon(R.mipmap.ic_launcher)
		.setContentIntent(pi)
		.setAutoCancel(true)//進入詳情頁後把狀態列的通知圖示取消
        .build();
//獲取通知服務
NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
manager.notify(1, notification);
//manager.cancel(1);//這裡取消也可以
複製程式碼

Notification基本使用(前臺服務)

PendingIntent pi = PendingIntent.getActivity(this,0,intent,0);
Notification notification = new NotificationCompat.Builder(this)
        .setContentTitle("this is content title")
        .setContentText("this is content text")
        .setWhen(System.currentTimeMillis())
        .setSmallIcon(R.mipmap.ic_launcher)
        .setLargeIcon(BitmapFactory.decodeResource(getResources(),R.mipmap.ic_launcher))
        .setContentIntent(pi)
        .build();
startForeground(1,notification);//這個方法會讓MyService變成一個前臺服務
複製程式碼

前臺服務和普通服務的最大區別就在於它會一直有一個正在執行的圖示在系統的狀態列顯示(普通服務會在點選通知進入詳情頁後消失)

判斷Wifi是否開啟

WifiManager wm = (WifiManager) getSystemService(WIFI_SERVICE);
boolean enabled = wm.isWifiEnabled();
複製程式碼

獲取系統最大音量

AudioManager am = (AudioManager) getSystemService(AUDIO_SERVICE);
int max = am.getStreamMaxVolume(AudioManager.STREAM_SYSTEM);
複製程式碼

獲取當前音量

AudioManager am = (AudioManager) getSystemService(AUDIO_SERVICE);
int current = am.getStreamMaxVolume(AudioManager.STREAM_RING);
複製程式碼

判斷網路是否有連線

ConnectivityManager cm = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);
NetworkInfo info = cm.getActiveNetworkInfo();
boolean isAvailable = info.isAvailable();
複製程式碼

TabLayout使用(ViewPager+Fragment+FragmentPagerAdapter)

  • 建立Fragment

      public static final String ARGS_PAGE = "args_page";
      private int mPage;
      public static PageFragment newInstance(int page) {
          Bundle args = new Bundle();
          args.putInt(ARGS_PAGE, page);
          PageFragment fragment = new PageFragment();
          fragment.setArguments(args);
          return fragment;
      }
      @Override
      public void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          mPage = getArguments().getInt(ARGS_PAGE);
      }
      @Nullable
      @Override
      public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
          View view = inflater.inflate(R.layout.fragment_page,container,false);
          TextView textView = (TextView) view.findViewById(R.id.textView);
          textView.setText("第"+mPage+"頁");
          return view;
      }
    複製程式碼
  • 介面卡類

      class MyFragmentPagerAdapter extends FragmentPagerAdapter {
          public final int COUNT = 5;
          private String[] titles = new String[]{"Tab1", "Tab2", "Tab3", "Tab4", "Tab5"};
          private Context context;
          public MyFragmentPagerAdapter(FragmentManager fm, Context context) {
              super(fm);
              this.context = context;
          }
          @Override
          public Fragment getItem(int position) {
              return PageFragment.newInstance(position + 1);
          }
          @Override
          public int getCount() {
              return COUNT;
          }
          @Override
          public CharSequence getPageTitle(int position) {
      		 //給tab加上圖片
              /*Drawable image = mContext.getResources().getDrawable(imageId[position]);
              image.setBounds(0, 0, image.getIntrinsicWidth(), image.getIntrinsicHeight());
              SpannableString spannableString = new SpannableString("  " + tabTitles[position]);
              ImageSpan imageSpan = new ImageSpan(image, ImageSpan.ALIGN_BASELINE);
              spannableString.setSpan(imageSpan, 0, 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
              return spannableString;*/
    
              return titles[position];
          }
      }
    複製程式碼
  • TabLayout的使用

      MyPagerAdapter mAdapter = new MyPagerAdapter(getSupportFragmentManager(),this);
      mViewPager.setAdapter(mAdapter);
      mTabs.setupWithViewPager(mViewPager);
      mTabs.setSelectedTabIndicatorColor(Color.CYAN);//設定指示器顏色
      mTabs.setTabTextColors(Color.BLACK,Color.WHITE);//設定選中顏色
      //tab標籤太少,沒有佔滿螢幕寬度,作如下設定
      mTabs.setTabMode(TabLayout.MODE_FIXED);//也可在佈局app:tabGravity="fill "app:tabMode="fixed"
      mTabs.setTabGravity(TabLayout.GRAVITY_FILL);
    複製程式碼

生成 JSON 物件和陣列

  • 建立一個 map,通過構造方法將 map 轉換成 json 物件

       Map<String, Object>map =new HashMap<String, Object>();
       map.put("name", "zhangsan ");
       map.put("age", 24);
       JSONObject json =new JSONObject(map);
    複製程式碼
  • 建立一個 json 物件,通過 put 方法新增資料

        JSONObject json=new JSONObject();
        json.put("name", "zhangsan "); 
        json.put("age", 24);
    複製程式碼
  • 生成 JSON 陣列:建立一個 list,通過構造方法將 list 轉換成 json 物件

       Map<String, Object>map1 =new HashMap<String, Object>();
       map1.put("name", "zhangsan ");
       map1.put("age", 24);
       Map<String, Object>map2 =new HashMap<String, Object>();
       map2.put("name", "lisi");
       map2.put("age", 25);
       List<Map<String, Object>>list=new ArrayList<Map<String,Object>>();
       list.add(map1);
       list.add(map2);
       JSONArray array=new JSONArray(list);
    複製程式碼

Android6.0許可權申請

`if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)!= PackageManager.PERMISSION_GRANTED) {
        ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},1);
    }
.....

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    switch (requestCode) {
        case 1:
            if (grantResults.length > 0 && grantResults[0] != PackageManager.PERMISSION_GRANTED) {
                Toast.makeText(this, "拒絕許可權將無法使用程式", Toast.LENGTH_SHORT).show();
                finish();
            }
            break;
        default:
            break;
    }
}`
複製程式碼

待續。。。。

相關文章