Android Activity的使用,持續更新

一.AndroidManifest中控制Activity中行爲

    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一塊兒使用

 

二.this引用在onClick方法中不能正確解析,在匿名內部類中提供當前上下文環境的方法:

    使用Context.this代替this

    使用getApplicationContext()來代替this

    顯示的使用類名

    聲明方法

 

三.將語音轉換成文本並啓動activity顯示結果:

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和Dialog)

在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返回須要的數據。

 

五.Activity跳轉時值傳遞

根據我的經驗大概總結三種方式:(由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" />

七.將Activity設置成對話框樣式

Android 將activity設置成對話框樣式

八.Android Activity 屏幕操做

九.跳轉到其餘應用的Activity

    跳轉方法:

/**
 * @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設置全屏

    Android Activity設置全屏

十一.判斷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());

12、Android Activity啓動時避免黑色閃屏有2種方法

 

十三、ActivityUtils

相關文章
相關標籤/搜索