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是系统默认的启动模式。