1.強制執行單任務模式:html
確保設備上只有一個activity實例在運行,須要在activity元素中包含MAIN和LAUNCHER兩個intent過濾器:java
android:launchMode="singleInstance"android
2.將全部的activity做爲同一個任務,共享信息方便:git
android:launchMode="singleTask"app
3.不管用戶經過什麼方式進入activity都能保存任務的狀態:(確保用戶老是可以返回到關閉以前的狀態)less
android:alwaysRetainTaskState="true"ide
4.activity強制設置縱向模式:函數
android:screenOrientation="portrait"ui
5.activity強制設置橫向模式:this
android:screenOrientation="landscape"
6.防止硬鍵盤滑出:
android:configChanges="orientation|keyboardHidden" 能夠和screenOrientation一塊兒使用
使用Context.this代替this
使用getApplicationContext()來代替this
顯示的使用類名
聲明方法
onClick方法中:
Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH); intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM); intent.putExtra(RecognizerIntent.EXTRA_PROMPT, "Say a word or phrase\nand it will show as text"); startActivityForResult(intent, RECOGNIZER_EXAMPLE); onActivityResult(): if(requestCode == RECOGNIZER_EXAMPLE && resultCode == RESULT_OK){ ArrayList<String> result = data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS); }
在Activity調用另外一Activity時,一般使用以下方法得到返回值:
Intent sampleIntent = new Intent(ThisActivity.this, NewActivity.class); startActivityForResult(sampleIntent , 1);
但若是調用的是Dialog類,或其餘非Activity類時,沒法使用startActivityForResult()方法。
此時,需使用另外一種方法得到返回值。方法以下:
假設:主Activity爲MainActivity;被調用的Dialog類爲SampleDialog
1.咱們需定義一個接口類:
interface MyListener{ public void refreshActivity(String text); }
2.在SampleDIalog的構造函數中傳入MyListener:
public MyListener (MyListener myListener){ this.mMyListener = myListener; }
3.在須要返回的地方調用refreshActivity()方法:
mMyListener.refreshActivity();
4.在MainActivity中實現MyListener接口,並在show Dialog時傳入實現的myListener:
private MyListener myListener = new MyListener(){ @Override public void refreshActivity(String text){ this.mTextView1.setText(text); } }; new SampleDialog(myListener).show;
這樣便能從Dialog返回須要的數據。
根據我的經驗大概總結三種方式:(由A向B傳遞參數)
1.intent傳遞消息
A中添加數據:
Intent intent = new Intent(A.this, B.class); intent.putExtra("activityMain","數據來自A"); // A中把數據添加進去 startActivity(); //startActivityForResult(intent1,REQUEST_CODE);
B中接收數據
Bundle extras = getIntent().getExtras(); if(extras!=null) String MUSIC_PATH =extras.getString("activityMain");
在基類的Activity中封裝方法:
<> (String key) { Intent intent = .getIntent()Object obj = intent.getExtras().get(key)(obj == ) { } () obj} (String key) { .getIntent().hasExtra(key)}
2.使用廣播方式,server傳遞消息這個方式也與intent有關
優勢:能夠後臺運行,直到真正退出應用程序
發送端:
ActivityReceiver activityreceiver = new ActivityReceiver();//建立廣播接收派生類 I IntentFilter filter = new IntentFilter();//建立IntentFilter消息過濾器 filter.addAction("jjplayer.update");//添加消息行爲 registerReceiver(activityreceiver, filter);//註冊監聽 Intent intent = new Intent(this,MyService.class); startService(intent);
其中ActivityReceiver 是本身建立的接收廣播類,參考代碼以下:
public class ActivityReceiver extends BroadcastReceiver { //自定義的廣播接收者 @Override public void onReceive(Context context, Intent intent) { method stub int update =intent.getIntExtra("update",-1);//獲得Intent中的數據 switch(update){ case 1://沒有聲音播放,設置當前狀態 status =1; break; case 2://開始播放,設置當前圖片爲播放狀態 //start.setImageResource(R.drawable.temp); btStart.setImageResource(R.drawable.pause); status = 2; break; case 3://暫停當中,設置圖片和狀態 btStart.setImageResource(R.drawable.play); status = 3; break; } } }
發送端註冊以後,就能夠根據不一樣的響應機制發送消息了,好比監聽按鍵來發送消息,參考代碼以下:
public void onClick(View v) { //來自單擊鼠標接口onclickListenner的方法 Intent intent = new Intent("yxj.play.control");//建立intent,濾波器內容爲 //包yxj.play中的control類 switch(v.getId()){ case R.id.btStart://開始播放按鈕 intent.putExtra("ACTION", 1); //存放數據 sendBroadcast(intent); //發送數據 break; case R.id.btStop: intent.putExtra("ACTION", 2); sendBroadcast(intent); break; } }
接收端:
接收端註冊信息
ServiceReceiver serviceRt = new ServiceReceiver();//建立廣播類BroadcastReceiver IntentFilter intentfilter = new IntentFilter();//建立過濾器 intentfilter.addAction("yxj.play.control"); registerReceiver(serviceRt, intentfilter);//註冊其中ServiceReceiver 是接收server消息的處理類,參考代碼以下 public class ServiceReceiver extends BroadcastReceiver{ Uri uri = Uri.parse("file:///sdcard/breathhard.mp3"); @Override public void onReceive(Context context, Intent intent) { int action = intent.getIntExtra("ACTION",-1);//獲取action switch(action){//根據action作出響應 case 1: if(status==1){ mp = MediaPlayer.create(context, uri); status = 2; Intent sendIntent = new Intent("yxj.play.update"); sendIntent.putExtra("update", 2);//準備發送小消息的內容 sendBroadcast(sendIntent);//廣播方式發送消息 mp.start(); }
server註冊:
這種方式的server須要在Androidmanifest.xml文件下面註冊,在</application>以前添加
<service android:name = ".MyService" android:process = ":remote"> </service>
3.使用SharedPreferrences存儲類
在類A中設置:
SharedPreferences param = getSharedPreferences("JJParam", MODE_PRIVATE); SharedPreferences.Editor editor = param.edit(); editor.putString("MUSIC_PATH", currentDirectory.toString()); editor.commit();
在類B中接收
SharedPreferences param = getSharedPreferences("JJParam", MODE_PRIVATE); if(param != null) {//若是文件已經存在,則繼續 if(param.getString("MUSIC_PATH",null)!=null)//獲取文件路徑 Music_Path = param.getString("MUSIC_PATH",null);
這種用法比較簡單,生成的JJParam.xml文件系統自動存儲到了/data/data/PACKAGE_NAME/shared_prefs目錄下
/data/data/PACKAGE_NAME /shared_prefs 目錄下。
4. URI
Uri分紅三部份:訪問資源的命名機制;存放資源的主機名;資源自身的名稱,由路徑表示。
好比「Http://www.baidu.com/text/xxx.html」
這裏面Http是命名機制(協議名),
www.baidu.com是資源位置,text/xxxlhtml是資源名稱。
在Android系統中如「content://contacts/1」表示,
在系統中contacts(聯繫人)中的第1號,就很容易定位到一個資源了,
採用了這些共用的格式後,就能夠與系統中的其餘處理程序來進行無縫交互,好比
Intent intent = new Intent(Intent.ACTION_DIAL, Uri.parse(「tel:555-2368」)); startActivity(intent);
就能夠用來啓動一個撥號程序。
定義好了參數格式,咱們在啓用界面裏就能夠用
Uri data = Uri.parse("xxxx"); intent.setData(data);//傳遞參數
在子界面中,咱們用
Intent intent = getIntent(); Uri data = intent.getData();
來接收傳來的參數
在子界面中,關閉界面時,也有肯定和取消之分,
咱們在點擊肯定按鈕時能夠這樣處理:
Uri data = Uri.parse("Content://" + edit.getText()); Intent result = new Intent(null, data); setResult(RESULT_OK, result);//傳肯定信息,和參數 finish();
當點擊取消按鈕時,這樣處理:
setResult(RESULT_CANCELED, null); //傳取消信息,和參數 finish();
在父界面中,咱們經過一個
public void onActivityResult(int requestCode, int resultCode, Intent data)
繼承函數來處理全部子界面的返回消息。這裏面傳來了請求代碼,返回代碼,和返回值,好比:
public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (resultCode == Activity.RESULT_OK) { Uri horse = data.getData(); TextView txt = (TextView)findViewById(R.id.TextView01); txt.setText(horse.toString()); } }
5.Android Intent傳值 Serializable Parcelable
首先要注意的是,這種沉浸式狀態欄的效果4.4系統及以上纔會支持
方法很簡單,在大家代碼setContentView以前中加入版本判斷:
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { //透明狀態欄 getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); //透明導航欄 一些手機若是有虛擬鍵盤的話,虛擬鍵盤就會變成透明的,擋住底部按鈕點擊事件因此,最好不要用 //getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION); }
在對應的xml中想讓狀態欄和哪一個View的背景顏色融合,就在哪一個View中加入下面兩行屬性就好了
好比我想讓狀態欄和某一個ImageView的顏色融合
android:fitsSystemWindows="true" android:clipToPadding="true"
<ImageView android:layout_width="match_parent" android:layout_height="match_parent" android:scaleType="centerCrop" android:fitsSystemWindows="true" android:clipToPadding="true" android:src="@drawable/bg_lesson_normal" />
跳轉方法:
/** * @Description: 跳轉至其餘應用 * @param appId 跳轉到的APP的包名 * @param activityName 跳轉到的APP的頁面的類名全稱 * @param bundle */ public void startOtherAPP(String appId, String activityName, Bundle bundle) { if (isAppInstalled(getActivity(), appId)) { Intent intent = new Intent(Intent.ACTION_MAIN); intent.addCategory(Intent.CATEGORY_LAUNCHER); ComponentName comp = new ComponentName(appId, activityName); intent.setComponent(comp); int launchFlags = Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED; intent.setFlags(launchFlags); intent.setAction("android.intent.action.VIEW"); if (bundle != null) { intent.putExtras(bundle); } getActivity().startActivity(intent); } }
判斷APP是否安裝:
/** * @Description: 判斷應用是否安裝 * @param context * @param packagename 跳轉到的APP的包名 * @return */ private boolean isAppInstalled(Context context, String packagename) { PackageInfo packageInfo; try { packageInfo = context.getPackageManager().getPackageInfo(packagename, 0); } catch (NameNotFoundException e) { packageInfo = null; e.printStackTrace(); } boolean isInstalled = (packageInfo == null) ? false : true; return isInstalled; }
經過包名和類名啓動Activity:
Intent intent = new Intent(); intent.setAction(Intent.ACTION_MAIN); intent.addCategory(Intent.CATEGORY_LAUNCHER); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.addFlags(Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED); intent.setPackage("com.hsae.d531mc.ipod"); intent.setClassName(mContext, "com.hsae.d531mc.ipod.view.MainActivity"); mContext.startActivity(intent);
十.Activity設置全屏
/** * 判斷某個界面是否在前臺 * * @param context * @param className * 某個界面名稱 */ private boolean isForeground(Context context, String className) { if (context == null || TextUtils.isEmpty(className)) { return false; } ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); List<RunningTaskInfo> list = am.getRunningTasks(1); if (list != null && list.size() > 0) { ComponentName cpn = list.get(0).topActivity; if (className.equals(cpn.getClassName())) { return true; } } return false; }
添加權限:
<uses-permission android:name="android.permission.GET_TASKS"/>
使用:
//以MainActivity爲例 boolean isShow = isForeground(this, MainActivity.class.getName()); app.shortToast("isForeground == " + isShow + ", className == " + MainActivity.class.getName()); Log.e("isShow", "isForeground == " + isShow + ", className == " + MainActivity.class.getName());