搜尋此網誌

顯示具有 Activity 標籤的文章。 顯示所有文章
顯示具有 Activity 標籤的文章。 顯示所有文章

2018年4月15日 星期日

【Android】在非Activity下使用startActivity()

會出現以下提示
Calling startActivity() from outside of an Activity  context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?
解決辦法很簡單
加上FLAG_ACTIVITY_NEW_TASK flag就可以。

Intent starter = new Intent(context, MainActivity.class);
starter.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
//starter.putExtra("from", from);

context.startActivity(starter);

2017年6月22日 星期四

【Android】Start Activity from preference screen (intent defined in xml file)

ref:https://stackoverflow.com/a/16943447
https://stackoverflow.com/a/10441707
https://stackoverflow.com/a/15288147


Preferences xml
<PreferenceCategory
        android:title="@string/my_activity_title">
    <PreferenceScreen
        android:title="@string/my_activity_title" 
        android:summary="@string/my_activity_title">
        <intent android:action="com.example.myapp.activities.MyActivity">
                <extra android:name="extra_name" android:value="my_value" />
        </Intent>
    </PreferenceScreen>
</PreferenceCategory>  
AndroidManifest.xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.example.myapp" android:versionName="1.3" android:versionCode="4">

...

    <activity android:name=".activities.MyActivity" 
              android:label="@string/my_activity_title"
              android:theme="@android:style/Theme.Black.NoTitleBar">
        <intent-filter>
           <action android:name="com.example.myapp.activities.MyActivity" />
           <category android:name="android.intent.category.DEFAULT" />
       </intent-filter>
    </activity>
MyActivity.java

getIntent().getStringExtra("extra_name") ....

2017年1月5日 星期四

【Android】Difference between getContext() , getApplicationContext() , getBaseContext()

ref:
http://stackoverflow.com/a/10641257


  • View.getContext(): Returns the context the view is currently running in. Usually the currently active Activity.
  • Activity.getApplicationContext(): Returns the context for the entire application (the process all the Activities are running inside of). Use this instead of the current Activity context if you need a context tied to the lifecycle of the entire application, not just the current Activity.
  • ContextWrapper.getBaseContext(): If you need access to a Context from within another context, you use a ContextWrapper. The Context referred to from inside that ContextWrapper is accessed via getBaseContext().

2016年2月16日 星期二

【Android】 Activity launchMode

ref:
http://developer.android.com/intl/zh-tw/guide/topics/manifest/activity-element.html#lmode http://developer.android.com/intl/zh-tw/guide/components/tasks-and-back-stack.html
http://img.my.csdn.net/uploads/201109/6/0_1315306406qQQp.gif

          android:launchMode=["multiple" | "singleTop" | 
                              "singleTask" | "singleInstance"]
Activity的四種launchmode,可在androidManifest.xml中定義。

  1. standard
    • 顧名思義,標準模式。
    • 若在androidManifest.xml中的<activity ...>,沒有定義launchMode,則會以此模式來跑。 (不要問我為什麼,上面的multiple,和這裡寫的standard不同,開發手冊就這樣寫。若真要定義的話,是寫"standard"無誤。
    • 每次執行都會create新的activity instance。
    • 因為同一個activity會被create多次,所以一個task有多個instance。
    • 例子:
      • Task Back Stack中,由bottom至top分別為Activity A|B|C|D,其中D未定義launchMode,所以是預設為standard模式。
      • 當Activity D再次被呼叫時,Back Stack由bottom至top會變為Activity A|B|C|D|D。
  2. singleTop
    • 欲呼叫該activity存在在stack top,不會重新create新的activity instance;反之,會重新呼叫。
    • 舉例來說
      • Back Stack由bottom至top分別為Activity A|B|C|D,其中D定義launchMode為singleTop模式。
      • 當Activity D再次被呼叫時,Back Stack依然是Activity A|B|C|D。
      • 若Activity B也定義launchMode為singleTop模式,當Activity B再次被呼叫時,Back Stack會在put B,成為Activity A|B|C|D|B。
  3. singleTask
    • 在同一個Task back stack中,只為存在唯一的Activity。
    • 當發現呼叫的Activity已存在在stack中,則會pop此activity上的其他activity,直到欲呼叫的Activity維持在stack top端。
    • 當發現呼叫的Activity不存在在stack中,當然就create新的Activity,並push到back stack中。
    • 例子:
      • Back Stack由bottom至top分別為Activity A|B|C|D,其中B定義launchMode為singleTask模式。
      • 當在Activity D,使用startActivity()...再次呼叫Activity B時,Back Stack變為Activity A|B。
  4. singleInstance
    • Activity永遠只存在一個task中,且它是唯一的Activity。
    • 例子:
      • Activity A開啟模式是定義standard,Activity B定義為singleInstance。A已開啟,接者啟動B,在啟動A。back stack會成為如下所示:
      • Activity A(task id 1) → Activity B(task id 2) → Activity AA(task id 1)。<此處A和AA都是一樣的Activity,為了講解方便,區別一下>。
      • 當按下back鍵,會變為Activity AA(task id 2) → Activity A(task id 1) → Activity B(task id 2)













有點複雜,但還沒想到可以活用的例子。先這樣。

另外,也可在startActivity()中定義intent flag,也可修改activity launchMode。

  • FLAG_ACTIVITY_NEW_TASK
    • 如同singleTask所作之動作。
  • FLAG_ACTIVITY_SINGLE_TOP
    • 如同singleTop所作之動作。
  • FLAG_ACTIVITY_CLEAR_TOP
    • 如果正在啟動的 Activity 已在目前的工作中執行,則不會啟動新的 Activity intent,而是會終結位於其上方的所有其他 Activity,且此intent會透過 onNewIntent() 傳送到繼續執行的 Activity 執行個體 (現在位於頂端)。
FLAG_ACTIVITY_CLEAR_TOP 最常與 FLAG_ACTIVITY_NEW_TASK 搭配使用。 一起使用時,這些旗標可以找出位於其他工作中的現有 Activity,然後將它放置於可以回應意圖的地方。

2014年12月30日 星期二

【Android】onActivityResult的用法

ref:http://blog.csdn.net/sjf0115/article/details/7387467


主要功能:
在一個主界面(主Activity)上能連接往許多不同子功能模塊(子Activity上去),當子模塊的事情做完之後就回到主界面,或許還同時返回一些子模塊完成的數據交給主Activity處理。這樣的數據交流就要用到回調函數onActivityResult。


  • startActivityForResult(Intent intent, int requestCode);

第一個參數:一個Intent對象
第二個參數:如果> = 0,當Activity結束時requestCode將歸還在onActivityResult()中。以便確定返回的數據是從哪個Activity中返回


  • onActivityResult(int requestCode, int resultCode, Intent data)

第一個參數:這個整數requestCode提供給onActivityResult,是以便確認返回的數據是從哪個Activity返回的。
            這個requestCode和startActivityForResult中的requestCode相對應。
第二個參數:這整數resultCode是由子Activity通過其setResult()方法返回。
第三個參數:一個Intent對象,帶有返回的數據。


  • setResult(int resultCode, Intent data)

調用這個方法把Activity想要返回的數據返回到父Activity
第一個參數:當Activity結束時resultCode將歸還在onActivityResult()中,一般為RESULT_CANCELED , RESULT_OK。
第二個參數:一個Intent對象,返回給父Activity的數據。

2014年10月24日 星期五

【Android】自訂Activity頁面切換效果 overridePendingTransition

類似PowerPoint在切換頁面的效果

overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out); 

 需添加在finsh()或startactivity()之後

 ex.

Intent intent = new Intent();
intent.setClass(MainActivity.this, SecondActivity.class);
startActivity(intent);
overridePendingTransition(R.anim.slide_in_up, R.anim.slide_out_down);  

 所以需要在res/anim添加對應的xml檔
相關範例可以在 sdk\platforms\android-21\data\res\anim中就可以找到

android2.0也就是level 5之後都有範例可以參考


(實現淡入淡出的效果)android.R.anim.fade_in, android.R.anim.fade_out;
(由左向右滑入的效果)android.R.anim.slide_in_left, android.R.anim.slide_out_right

 (由上向下滑入的效果)android.R.anim.slide_in_up, android.R.anim.slide_out_down

當然也可以自定義動畫效果