anyuan2002.com - vwin网

查找: 您的方位主页 > 手机频道 > 阅览资讯:Android活动——Activity浅析

Android活动——Activity浅析

2019-04-20 07:36:22 来历:www.anyuan2002.com 【

Those who dare to fail miserably can achieve greatly.
不怕惨败,才干有巨大的成果。–约翰·肯尼迪

1 Activity 概念

参考文献


活动是一种能够包括用户界面的组件,首要用于和用户进行交互

活动供给运用程序制作其UI的窗口。此窗口一般填充屏幕,但或许小于屏幕并起浮在其他窗口的顶部。一般,一个活动在运用程序中完结一个屏幕。例如,运用程序的某个活动或许会完结*“首选项”*屏幕,而另一个活动会完结“ *挑选相片”*屏幕。

大多数运用程序包括多个屏幕,这意味着它们包括多个活动 一般,运用程序中的一个活动被指定为首要活动,这是用户发动运用程序时显现的榜首个屏幕。然后,每个活动能够发动另一个活动以履行不同的操作。

Android活动——Activity浅析

2 Activity根本用法

  • 一切的活动都要在AndroidManifest.xml中进行注册才干收效。活动的注册声明要放在<application>标签内,在<activity>标签中是晕了android:name来指定详细注册哪一个活动。

  • **装备主活动的办法**便是在<application>标签内参加<intent-filter>标签,并在这个标签内增加

    <action android:name="android.intent.action.MAIN" />
    
    <category android:name="android.intent.category.LAUNCHER" />
    

声明权限

You can use the manifest’s <activity> tag to control which apps can start a particular activity. A parent activity cannot launch a child activity unless both activities have the same permissions in their manifest. If you declare a<uses-permission> element for a particular activity, the calling activity must have a matching <uses-permission> element.

<manifest>
<activity android:name="...."
 android:permission=”com.google.socialapp.permission.SHARE_POST”
/>

假如要答应调用SocialApp,您的运用有必要与SocialApp清单中设置的权限相匹配

<manifest> <uses-permission android:name = “com.google.socialapp.permission.SHARE_POST” /> </ manifest>

毁掉一个活动

毁掉活动只要按back键就能够,并且Activity类供给一个finish()办法,活动中调用这个办法就能够毁掉当时活动。将前述的按钮监听器代码参加该办法即可。

运用Intent

运用显式Intent

Intent事Android程序中各组件之间进行交互的一种重要办法,不只能够指明当时组件想要履行的动作,还能够在不同组件之间进行传递数据。被用于发动活动,发动服务以及发送播送等场景

Activity类中供给一个startActivity()办法,专门用于发动活动,承受一个Intent参数,构建好的Intent传入该办法就能够发动方针活动了。创立一个新的Activity——SecondActivity。

  • 修正FirstActivity中按钮点击事情代码:
public void onClick(View v) {
        Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
        startActivity(intent);
      }
  • 或经过IntentComponentName来发动
ComponentName cn = new ComponentName("com.vivo.a11085273.activitytest","com.vivo.a11085273.activitytest.ThirdActivity");
Intent intent = new Intent();
intent.setComponent(cn);
startActivity(intent);
  • 或经过初始化Intent时指定包名
Intent intent = new Intent("android.intent.action.MAIN");
intent.setClassName("com.vivo.a11085273.activitytest", "com.vivo.a11085273.activitytest.ThirdActivity");
startActivity(intent);

运用隐式Intent

不明确指出咱们想要发动哪一个活动,指定了一系列更为笼统的action和category等信息,交由体系分析这个Intent,找出适宜的Intent去发动。经过Intent的Intent-filter完结。

<activity android:name=".SecondActivity">
      <intent-filter>
        <action android:name="com.vivo.a11085273.activitytest.ACTION_START" />
        <category android:name="android.intent.category.DEFAULT" />
      </intent-filter>
    </activity>

修正FirstActivity中按钮点击事情:

@Override
      public void onClick(View v) {
        Intent intent = new Intent("com.vivo.a11085273.activitytest.ACTION_START");
        intent.addCategory("com.vivo.a11085273.activitytest.MY_CATEGORY");
        startActivity(intent);
      }

每个Intent只能指定一个action,可是却能指定多个category。能够调用Intent中的addCategory()办法来增加category。

隐式Intent其他功用

运用隐式Intent不只能够发动程序内的活动,还能够发动其他程序的活动,使得Android多个运用程序之间的功用同享成为了或许。

示例:

@Override
      public void onClick(View v) {
        Intent intent = new Intent(Intent.ACTION_VIEW);
        intent.setData(Uri.parse("http://www.google.com.hk"));
        startActivity(intent);
      }

Uri.parse将一个网址字符串解析成一个Uri目标。

假如自己创立一个活动,也能够呼应翻开网页的Intent。

新建Activity,修正布局文件,在AndroidManifest.xml中修正ThirdActivity注册信息:

<activity android:name=".ThirdActivity">
      <intent-filter tools:ignore="AppLinkUrlError">
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <data android:scheme="http" />
      </intent-filter>
    </activity>

除了http协议外,能够指定许多其他协议,比方:geo表明显现地理方位,tel表明拨打电话。

3 Activity间数据传递

一个app一般都是由多个Activity构成,这就涉及到多个Acitivity间数据传递。

Android活动——Activity浅析

Intent向下一个活动传递数据

Intent中供给了一些列putExtra()办法的重载,能够吧想要传递的数据暂存在Intent中,发动了另一个活动后,把这些数据从Intent中取出来就能够。

示例:在FirstActivity中修正点击按钮监听代码

@Override
      public void onClick(View v) {
        String data = "Hello SecondActivity";
        Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
        intent.putExtra("extra_data", data);
        startActivity(intent);
      }

修正SecondActivity中代码:

@Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.second_activity);
    Intent intent = getIntent();
    String data = intent.getStringExtra("extra_data");
    Log.d("SecondActivity", data);
  }

回来数据给上一个活动

Activity中还有一个startActivityForResult()办法也适用于发动活动,可是该办法希望活动毁掉的时分回来一个成果给上一个活动。

Android活动——Activity浅析

该办法接纳两个参数,一个是Intent,第二个参数是恳求码,用于之后在回调中判别数据的来历。

首要修正FirstActivity中点击按钮监听事情代码:

 @Override
      public void onClick(View v) {
        Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
        startActivityForResult(intent,1);
      }

其次修正SecondActivity中代码:

@Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.second_activity);
    Button button2 = (Button) findViewById(R.id.button_2);
    button2.setOnClickListener(new View.OnClickListener() {

      @Override
      public void onClick(View v) {
        Intent intent = new Intent();
        intent.putExtra("data_return","Hello FirstActivity");
        setResult(RRSULT_OK, intent);
        finish();
      }
    });
  }

最终在FirstActivity中重写这个办法来得到回来数据:

 @Override
  protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    switch(requestCode) {
      case 1:
        if (resultCode == RESULT_OK) {
          String returnedData = data.getStringExtra("data_return");
          Log.d("FritstActivity",returnedData);
        }
        break;
      default:
    }
  }

假如是经过back键回来,则能够经过在SecondActivity中重写onBackPressed()来处理:

 @Override
  public void onBackPressed() {
    Intent intent = new Intent();
    intent.putExtra("data_return","Hello FirstActivity");
    setResult(RESULT_OK, intent);
    finish();
  }

3 活动的生命周期

回来栈

Android中的活动是能够层叠的。每发动一个新的活动,就会掩盖本来的活动之上,点击Back键就会毁掉最上面的活动。

Android是运用使命(Task)来办理活动的,一个使命便是一组存放在栈里的活动的调集,这个栈也称作回来栈(Back Stack)。体系总是会显现处于栈顶活动给用户。

Android活动——Activity浅析

活动状况

每个活动在其生命周期中最多或许会有4中状况:

  • 运转状况:

    活动坐落回来栈的栈顶时,这时活动就处于运转状况。

  • 暂停状况:

    活动不处于栈顶时,可是依然可见,活动就进入暂停状况。

  • 中止状况:

    活动不处于栈顶方位,且彻底不行见,就进入中止状况。处于中止状况的活动有或许会被体系收回

  • 毁掉状况:

    活动从回来栈中移除后就变成了毁掉状况。

活动的生命周期

Activity类中界说了7种回调办法,掩盖了活动生命周期的每一个环节:

  • onCreate():完结活动的初始化操作,比方加载布局,绑定事情
  • onStart():在活动由不行见变为可见的时分调用
  • onResume():在活动预备好和用户进行交互时调用。该活动必定处于回来栈栈顶,且处于运转状况
  • onPause():体系预备去发动或许康复另一个活动的时分调用。该办法的履行速度必定要快,否则会影响到新的栈顶活动的运用
  • onStop:在活动彻底不行见时调用,与前者的差异时发动的新活动是一个对话框式的活动,那么onPause()办法会得到履行,而该办法不会
  • onDestrory():在活动被毁掉之前调用,之后活动变为毁掉状况
  • onRestart():由中止状况变为运转时状况之前调用,活动被从头发动。

除了**onRestart()**办法之外,其他都是两两相对的,活动分为3中生存期:

  • 完好生存期:活动在onCreate()onDestrory()之间阅历的便是完好生存期
  • 可见生存期:活动在onStart()onStop之间阅历的便是可见生存期。活动关于用户总是可见的,即使有或许无法和用户进行交互。
  • 前台生存期:活动在onResume()onPause()之间阅历的便是前台生存期。活动总是处于运转状况,此刻活动能够和用户进行交互。

Android活动——Activity浅析

onCreate()代码示例:

TextView mTextView;

// some transient state for the activity instance
String mGameState;

@Override
public void onCreate(Bundle savedInstanceState) {
  // call the super class onCreate to complete the creation of activity like
  // the view hierarchy
  super.onCreate(savedInstanceState);

  // recovering the instance state
  if (savedInstanceState != null) {
    mGameState = savedInstanceState.getString(GAME_STATE_KEY);
  }

  // set the user interface layout for this activity
  // the layout file is defined in the project res/layout/main_activity.xml file
  setContentView(R.layout.main_activity);

  // initialize member TextView so we can manipulate it later
  mTextView = (TextView) findViewById(R.id.text_view);
}

// This callback is called only when there is a saved instance that is previously saved by using
// onSaveInstanceState(). We restore some state in onCreate(), while we can optionally restore
// other state here, possibly usable after onStart() has completed.
// The savedInstanceState Bundle is same as the one used in onCreate().
@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
  mTextView.setText(savedInstanceState.getString(TEXT_VIEW_KEY));
}

// invoked when the activity may be temporarily destroyed, save the instance state here
@Override
public void onSaveInstanceState(Bundle outState) {
  outState.putString(GAME_STATE_KEY, mGameState);
  outState.putString(TEXT_VIEW_KEY, mTextView.getText());

  // call superclass to save any view hierarchy
  super.onSaveInstanceState(outState);
}

活动被收回

假如一个活动进入中止状况,有或许被体系收回,其间的数据在收回时或许得不到保存。

Activity中供给了一个onSaveInstanceState()回调办法,这个办法能够保证活动被收回之前必定被调用,能够经过这个办法来保存数据。

@Override
  protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    String tempData = "Something you just typed";
    outState.putString("data_key", tempData);
  }

数据的取值能够在onCreate()办法中取出:

 if (savedInstanceState != null) {
      String tempData = savedInstanceState.getString("data_key");
      Log.d(TAG, tempData);
    }

4 反正屏切换与状况保存

官方文档:反正屏切换

参考文献一:gdutxiaoxu博客

参考文献二:菜鸟教程

参考文献三:反正屏常识小结


App反正屏切换的时分会毁掉当时的Activity然后从头创立一个,你能够自行在生命周期 的每个办法里都增加打印Log的句子,来进行判别,又或许设一个按钮一个TextView点击按钮后,修正TextView 文本,然后反正屏切换,会奇特的发现TextView文本变回之前的内容了! 反正屏切换时Activity走下述生命周期:
onPause-> onStop-> onDestory-> onCreate->onStart->onResume

制止屏幕反正屏主动切换

假如要制止屏幕反正屏主动切换,在AndroidManifest.xml中为Activity增加一个特点:android:screenOrientaiton

。。。

5 发动形式

发动形式一共有4种,分别是:standardsingleTopsingleTasksingleInstance。能够再AndroidManifest.xml中经过<activity>标签指定android:launchMode特点来挑选发动形式。

standard

默许形式,每逢发动一个新活动,就会在回来栈中入栈,并处于栈顶方位。该形式的活动不管这个活动是否在回来栈中存在,每次发动都会创立该活动的新实例。

Android活动——Activity浅析

singleTop

当活动指定为singleTop形式,发动活动时假如发现回来栈的栈顶已经是该活动,则以为能够直接运用它,不会再创立新的活动实例。

Android活动——Activity浅析

singleTask

当活动的发动形式指定为singleTask,每次发动该活动体系首要会在回来栈中检查是否存在该活动的实例,假如发现就直接运用,并把这个活动之上的一切活动通通出栈。假如没有发现就创立一个新的活动实例。

Android活动——Activity浅析

singleInstance

指定为singleInstance形式的活动会启用一个新的回来栈来办理这个活动(假如singleTask形式指定了不同的taskAffinity,也会发动一个新的回来栈)。这种形式处理了其他程序和咱们的程序同享一个活动的实例。

Android活动——Activity浅析

6 活动实践

确认当时活动

例如需求在某个界面上修正相关东西,快速定位该界面对应的活动

新建一个Java类:BaseActivity,承继AppCompatActivity,重写onCreate()办法。

@Override
  protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Log.d("BaseActivity", getClass().getSimpleName());
  }

oncreate()办法中获取了当时实例的类名,然后将项目中一切活动的父类都不再承继AppCompatActivity,而是承继BaseActivity,这样检查日志,,每逢进入一个活动的界面,该活动的类名就被打印出来。

随时退出程序

按home键仅仅将程序挂起,并没有退出程序,假如程序需求一个刊出或许退出的功用,只需求一个专门的调集类对一切的活动进行办理就能够。

新建一个ActivityCollector类作为活动办理器:

public class ActivityCollector {

  public static List<Activity> activities = new ArrayList<>();

  public static void addActivity(Activity activity) {
    activities.add(activity);
  }

  public static void removeActivity(Activity activity) {
    activities.remove(activity);
  }

  public static void finishAll() {
    for (Activity activity : activities) {
      if (!activity.isFinishing()) {
        activity.finish();
      }
    }
  }
}

之后修正BaseActivity:

public class BaseActivity extends AppCompatActivity {

  @Override
  protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Log.d("BaseActivity", getClass().getSimpleName());
    ActivityCollector.addActivity(this);
  }

  @Override
  protected void onDestroy() {
    super.onDestroy();
    ActivityCollector.removeActivity(this);
  }
}

假如需求在某个当地退出程序,调用ActivityCollector.finishAll()办法就能够。

能够再毁掉一切活动代码的后边加上杀掉当时进程,保证程序彻底退出:

android.os.Process.killProcess(android.os.Process.myPid());

其间killProcess()办法用于杀掉一个进程,接纳一个进程参数,经过myPid()办法能够获得当时程序的进程id。

发动活动最佳写法

假如你的模块需求将一些重要数据传递给另一个模块,例如两个字符串参数,可是你不清楚发动这个活动需求传递哪些数据,只需在发动活动增加一个actionStart()办法。

public static void actionStart(Context context, String data1, String data2) {
    Intent intent = new Intent(context, SecondActivity.class);
    intent.putExtra("param1", data1);
    intent.putExtra("param2", data2);
    context.startActivities(intent);
  }

这时分假如想要发动该活动,只需一行代码就能够发动SecondActivity。

 button1.setOnClickListener(new View.OnClickListener() {

      @Override
      public void onClick(View v) {
      SecondActivity.actionStart(FirstActivity.this, "data1", "data2");
      }
 }

7 体系供给常见Activity

//1.拨打电话
// 给移动客服10086拨打电话
Uri uri = Uri.parse("tel:10086");
Intent intent = new Intent(Intent.ACTION_DIAL, uri);
startActivity(intent);

//2.发送短信
// 给10086发送内容为“Hello”的短信
Uri uri = Uri.parse("smsto:10086");
Intent intent = new Intent(Intent.ACTION_SENDTO, uri);
intent.putExtra("sms_body", "Hello");
startActivity(intent);

//3.发送彩信(相当于发送带附件的短信)
Intent intent = new Intent(Intent.ACTION_SEND);
intent.putExtra("sms_body", "Hello");
Uri uri = Uri.parse("content://media/external/images/media/23");
intent.putExtra(Intent.EXTRA_STREAM, uri);
intent.setType("image/png");
startActivity(intent);

//4.翻开浏览器:
// 翻开Google主页
Uri uri = Uri.parse("http://www.baidu.com");
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
startActivity(intent);

//5.发送电子邮件:(阉割了Google服务的没戏!!!!)
// 给someone@domain.com发邮件
Uri uri = Uri.parse("mailto:someone@domain.com");
Intent intent = new Intent(Intent.ACTION_SENDTO, uri);
startActivity(intent);
// 给someone@domain.com发邮件发送内容为“Hello”的邮件
Intent intent = new Intent(Intent.ACTION_SEND);
intent

本文地址:http://www.anyuan2002.com/a/luyou/100433.html
Tags: Android 活动 Activity
修正:vwin网
  • 上一篇:数据库:mySQL装置
  • 下一篇:没有了
  • 关于咱们 | 联络咱们 | 友情链接 | 网站地图 | Sitemap | App | 回来顶部