androidactivity實例
㈠ android activity單實例化什麼意思
意思就是這個Activity只能有一個實例(如果被多次啟動的話)
manifest.xml裡面配置 在activity標簽下的屬性
android:launchMode="standard"
有4種可以選 默認就是上面這種,,標準的 每次startActivity都會實例化一個實例
還有3種:singleTop 啟動此模式的activity的時候 如果在堆棧頂部已經有這個activity的實例則不重新實例化,就用堆棧頂部這個 否則就實例化一個新的activity對象
singleTask 啟動此模式的activity的時候 如果在堆棧中存在此activity的實例(任意位置),則不重新實例化activity對象 而是直接復用之前的activity對象 在這個activity對象上面的其他activity對象全部移除(相當於這些activity被銷毀了);這個應該就是你說的單實例化
singleInstance 這個是單個實例 會單獨啟動一個堆棧來存放此啟動模式的activity實例!
㈡ 如何在另外一個類裡面獲得某個activity的實例
在「手機頁面之間的跳轉」一文中我介紹了如何運用setContentView()方法切換布局文件Layout的方式進行手機頁面間的跳轉, 這種適合更改背景,文字顏色,文字內容,但是始終是一個Activity,如果要把主控權移交給另外一個Activity,切換布局文件Layout的方式就辦不到了。
如何把主控權移交給另外一個Activity呢?原理:通過Intent對象和startActivity()方法配合來實現。在主程序里使用startActivity()方法調用另外一個Activity,但是最主要的不是這個startActivity()方法,而是Intent對象,Intent在英文中是「意圖」的意思,在主Activity當中,告訴程序自己是什麼,並想要前往哪裡,這就是Intent對象要做的事情了。在主Activity(ActivityOne)里放置一個按鈕,當單擊這個按鈕的時候,告訴主Activity(ActivityOne)前往ActivityTwo,並在ActivityTwo里放置一個回到主Activity(ActivityOne)的一個按鈕。
實現步驟
一:布局文件編寫
1.1:第一個布局文件main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="我是ActivityOne"
/>
<Button
android:id="@+id/mainbtn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="調用ActivityTwo"
/>
</LinearLayout>
1.2:第二個布局文件two.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="我是ActivityTwo"
/>
<Button
android:id="@+id/twobtn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="調用ActivityOne"
/>
</LinearLayout>
二:代碼文件編寫
2. 1:MainActivity.java
package com.menglin.callactivity;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class MainActivity extends Activity
{
//聲明一個Button對象
private Button mainbtn = null;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
//載入main.xml布局文件
setContentView(R.layout.main);
//以findViewById()方法取得Button對象
mainbtn = (Button)findViewById(R.id.mainbtn);
//給Button對象綁定單擊監聽事件
mainbtn.setOnClickListener(listener);
}
//監聽事件
private OnClickListener listener = new OnClickListener()
{
@Override
public void onClick(View v)
{
//創建一個intent對象
Intent intent = new Intent();
//指定原本的class和要啟動的class
intent.setClass(MainActivity.this, TwoActivity.class);
//調用另外一個新的Activity
startActivity(intent);
//關閉原本的Activity
MainActivity.this.finish();
}
};
}
2. 2:TwoActivity.java
package com.menglin.callactivity;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class MainActivity extends Activity
{
//聲明一個Button對象
private Button twobtn= null;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
//載入two.xml布局文件
setContentView(R.layout.two);
//以findViewById()方法取得Button對象
twobtn= (Button)findViewById(R.id.twobtn);
//給Button對象綁定單擊監聽事件
twobtn.setOnClickListener(listener);
}
//監聽事件
private OnClickListener listener = new OnClickListener()
{
@Override
public void onClick(View v)
{
//創建一個intent對象
Intent intent = new Intent();
//指定原本的class和要啟動的class
intent.setClass(TwoActivity.this, MainActivity.class);
//調用另外一個新的Activity
startActivity(intent);
//關閉原本的Activity
TwoActivity.this.finish();
}
};
}
三:配置文件
AndroidMainfest.xml
1:當系統中新添加了一個Activity時,必須在AndroidMainfest.xml里定義一個新的Activity,由於我們新創建了TwoActivity.java,所以我們需要在AndroidMainfest.xml里加上如下代碼,如果不加的話,系統會因為找不到Activity而發生編譯性錯誤。
<activity android:name=".TwoActivity"
android:label="@string/app_name">
</activity>
2:當程序中出現了兩個Activity時,系統要決定主程序是哪一支,所以我們需要在AndroidMainfest.xml里定義如下代碼,這個參數必須要被定義,如果不加的話,則程序不會被運行。
其中<category android:name="android.intent.category.LAUNCHER" />,就代表了程序啟動時,會運行MainActivity而非TwoActivity。
<activity android:name=".MainActivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
㈢ android 如何獲取手機當前的Activity實例
獲取activity實例有兩種辦法:
1、通過context來獲取,簡單方便:
private String getRunningActivityName() {
String contextString = context.toString();
return contextString.substring(contextString.lastIndexOf(".") + 1, contextString.indexOf("@"));
}
2、通過特定許可權獲取
<uses-permission android:name="android.permission.GET_TASKS" />
private String getRunningActivityName(){
ActivityManager activityManager=(ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
String runningActivity=activityManager.getRunningTasks(1).get(0).topActivity.getClassName();
return runningActivity;
}
㈣ android 啟動 activity 是什麼意思
當應用運行起來後就會開啟一條線程,線程中會運行一個任務棧,當Activity實例創建後就會放入任務棧中。Activity啟動模式的設置在AndroidManifest.xml文件中,通過配置Activity的屬性android:launchMode=""設置。
1. Standard模式(默認)
我們平時直接創建的Activity都是這種模式的Activity,這種模式的Activity的特點是:只要你創建了Activity實例,一旦激活該Activity,則會向任務棧中加入新創建的實例,退出Activity則會在任務棧中銷毀該實例。
2. SingleTop模式
這種模式會考慮當前要激活的Activity實例在任務棧中是否正處於棧頂,如果處於棧頂則無需重新創建新的實例,會重用已存在的實例,否則會在任務棧中創建新的實例。
3. SingleTask模式
如果任務棧中存在該模式的Activity實例,則把棧中該實例以上的Activity實例全部移除,調用該實例的newInstance()方法重用該Activity,使該實例處於棧頂位置,否則就重新創建一個新的Activity實例。
4. SingleInstance模式
當該模式Activity實例在任務棧中創建後,只要該實例還在任務棧中,即只要激活的是該類型的Activity,都會通過調用實例的newInstance()方法重用該Activity,此時使用的都是同一個Activity實例,它都會處於任務棧的棧頂。此模式一般用於載入較慢的,比較耗性能且不需要每次都重新創建的Activity。
㈤ 如何管理Android中Activity的生命周期
管理Android中Activity的生命周期
在一個activity的生命周期中,系統會像金字塔模型一樣去調用一系列的生命周期回調函數。Activity生命周期的每一個階段就像金字塔中的台階。當系統創建了一個新的activity實例,每一個回調函數會向上一階移動activity狀態。處在金字塔頂端意味著當前activity處在前台並處於用戶可與其進行交互的狀態。
當用戶退出這個activity時,為了回收該activity,系統會調用其它方法來向下一階移動activity狀態。在某些情況下,activity會隱藏在金字塔下等待(例如當用戶切換到其他app),此時activity可以重新回到頂端(如果用戶回到這個activity)並恢復用戶離開時的狀態。
根據activity的復雜度,也許不需要實現所有的生命周期方法。但了解每一個方法的回調時機並在其中填充相應功能,使得確保app能夠像用戶期望的那樣執行是很有必要的。如何實現一個符合用戶期待的app,我們需要注意下面幾點:
使用app的時候,不會因為有來電通話或者切換到其他app而導致程序crash。
用戶沒有激活某個組件時不會消耗寶貴的系統資源。
離開app並且一段時間後返回,不會丟失用戶的使用進度。
設備發生屏幕旋轉時不會crash或者丟失用戶的使用進度。
只有三個狀態是靜態的,這三個狀態下activity可以存在一段比較長的時間。(其它幾個狀態會很快就切換掉,停留的時間比較短暫)
Resumed:該狀態下,activity處在前台,用戶可以與它進行交互。(通常也被理解為"running" 狀態)
Paused:該狀態下,activity的部分被另外一個activity所遮蓋:另外的activity來到前台,但是半透明的,不會覆蓋整個屏幕。被暫停的activity不再接受用戶的輸入且不再執行任何代碼。
Stopped:該狀態下, activity完全被隱藏,對用戶不可見。可以認為是在後台。當stopped, activity實例與它的所有狀態信息(如成員變數等)都會被保留,但activity不能執行任何代碼。
㈥ Android 中如何在java類中調用activity 中的一個方法
通常,您不應該以這種方式創建新的 MainActivity 實例。要打開一個新的 MainActivity,請使用 Intent。在您的情況下,您應該引用原始 MainActivity 實例,並在那裡調用此方法。不要以任何方式創建新的,因為您已經在運行它。
一個簡單的解決方法:
MainActivity.this.myMethod("Hello there")
您不必存儲mContext. 你已經在 MainActivity 裡面了。
因此,完整的代碼將是:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
WebView myWebView = findViewById(R.id.webview);
myWebView.loadUrl("http://www.google.com");
myWebView.addJavascriptInterface(new WebAppInterface(), "Android");
}
public void myMethod(String test){
Toast.makeText(this, test, Toast.LENGTH_SHORT).show();
}
public class WebAppInterface {
/** Show a toast from the web page */
@JavascriptInterface
public void showToast(String toast) {
MainActivity.this.myMethod("Hello there");
}
}
}
實際上,我認為您甚至可以避免使用MainActivity.this., 並myMethod直接調用。
㈦ android每個應用都有一個堆棧task來存放啟動的Activity實例我不能理taskid在實際開發中的作用是什麼
在開發中,Task的概念應該是與Activity棧相對應的。
換言之,Activity通過不同的啟動模式去啟動,所處的Task是不一樣的(如singletask)。
相應的也就會對畫面遷移和內存分配等問題產生影響。
暫時就想到這些~
㈧ Android 如何在其他類裡面獲得MainActivity類的實例,從而引用MainActivity類里的變數
1一般來說,這樣做是不好的.如果要這樣做,說明你的設計存在一定的問題.
首先從面向對象設計來說,不應該直接引用其他類的變數,而只應該通過類的方法來完成對類的操作.
此外因為Activity生命周期的管理是由android framework來實現的,你難以確切知道MainActivity的狀態,無法保證引用變數的有效性.
如果一定要這么做,你可以實現一個類似getInstance的靜態方法,不過注意不能像單例設計模式那樣,new 一個MainActivity,而是在onreate的時機給靜態變數instance賦值.
㈨ Android Studio怎樣新建Activity
在Android中每個界面都是一個Activity,切換界面操作其實是多個不同Activity之間的實例化操作。在Android中Activity的啟動模式決定了Activity的啟動運行方式。
Android總Activity的啟動模式分為四種:
Activity啟動模式設置:
<activityandroid:name=".MainActivity"android:launchMode="standard"/>
Activity的四種啟動模式:
1.standard模式啟動模式,每次激活Activity時都會創建Activity,並放入任務棧中。
2.singleTop如果在任務的棧頂正好存在該Activity的實例,就重用該實例,否者就會創建新的實例並放入棧頂(即使棧中已經存在該Activity實例,只要不在棧頂,都會創建實例)。
3.singleTask如果在棧中已經有該Activity的實例,就重用該實例(會調用實例的onNewIntent())。重用時,會讓該實例回到棧頂,因此在它上面的實例將會被移除棧。如果棧中不存在該實例,將會創建新的實例放入棧中。
4.singleInstance在一個新棧中創建該Activity實例,並讓多個應用共享改棧中的該Activity實例。一旦改模式的Activity的實例存在於某個棧中,任何應用再激活改Activity時都會重用該棧中的實例,其效果相當於多個應用程序共享一個應用,不管誰激活該Activity都會進入同一個應用中。
其中standard是系統默認的啟動模式。