湘潭网站建设 磐石网络实惠,市场营销毕业后做什么工作,建网站的宽带多少钱,wordpress分类子目录这篇文章是我自己的《第一行代码Andorid》的阅读笔记#xff0c;虽然大量参考了别人已经写好的一些笔记和代码但是也有自己的提炼和新的问题在里面#xff0c;我也会放上参考文章链接。 学习重点
Android系统的四大组件#xff1a; #xff08;1#xff09;活动#xff… 这篇文章是我自己的《第一行代码Andorid》的阅读笔记虽然大量参考了别人已经写好的一些笔记和代码但是也有自己的提炼和新的问题在里面我也会放上参考文章链接。 学习重点
Android系统的四大组件 1活动Activity是所有Android应用程序的门面凡是在应用中你看得到的东西都是放在活动中的。 2服务Service你无法看到它但它会一直在后台默默地运行即使用户退出了应用服务仍然是可以继续运行的。 3广播接收器Broadcast Receiver广播接收器允许你的应用接收来自各处的广播消息比如电话、短信等当然你的应用同样也可以向外发出广播消息。 4内容提供器Content Provider为应用程序之间共享数据提供了可能比如你想要读取系统电话簿中的联系人就需要通过内容提供器来实现。
参考笔记
https://www.cnblogs.com/1693977889zz/p/16256303.html
开始第一个Android项目
注意点
如果要跟着《第一行代码Android篇第2版》这本书学习一定一定一定要把SDK版本以及设备模拟器设置成和书里一样的我一开始就是因为SDK版本太高出现了很多的错误和不同之处。以前的旧版本虽然和新版本有不一样的地方但是不影响理解Android架构。书中的配置是 Minimum SDKAPI 15 设备模拟器Nexus 5X 操作系统版本API Level 24 Target Android 7.0 (Google Play)多用调试工具Log而不是System.out 除了Log.v()、Log.d()、Log.i()、Log.w()、Log.w()之外logcat中还能很轻松地添加过滤器 目前只有3个过滤器
Show only selected application表示只显示当前选中程序的日志Firebase是谷歌提供的一个分析工具我们可以不用管它NoFilters相当于没有过滤器会把所有的日志都显示出来
目录结构略可以参考上面提供的笔记链接和书上的内容一样。
第一章 活动
注意点
第一次Greadle构建需要点时间要下载很多东西需要翻墙可能失败没关系多试几次。新建project的时候记得一定要选择语言为Java但是注意如果选择Empty Activity就会没有语言选择的选项所以我们跟着书上选择No Activity或者Empty View Activity 暂时无法在飞书文档外展示此内容
1. 活动的基本用法
1.1 创建活动
在创建新的活动的时候会遇到几个选项
勾选Generate Layout File表示会自动为FirstActivity创建一个对应的布局文件勾选Launcher Activity表示会自动将FirstActivity设置为当前项目的主活动
创建的.xml的layout布局文件在右上角可以有几种模式选择
Code Mode代码模式 这个模式允许您直接编辑布局文件的 XML 代码。您可以在这里手动编写 XML 代码来定义布局结构、属性和样式。这是最灵活的方式适用于对 XML 布局代码熟悉的开发者。Split Mode分割模式 这个模式将布局文件分为两个窗格上半部分显示布局的设计预览下半部分显示布局的 XML 代码。这允许您同时查看设计和代码方便调整布局时的实时预览以及在代码中进行必要的修改。Design Mode设计模式 这个模式提供了一个可视化的界面允许您通过拖放组件、设置属性和布局以图形方式创建和编辑布局。在这个模式下您可以快速预览 UI 的外观而不需要直接编辑代码。
1.2 活动注册
所有的活动都要在AndroidManifest.xml中进行注册才能生效一般编辑器会帮我们自动注册。
intent-filter用于指定主活动,即点击桌面应用程序图标时首先打开的就是这个活动。
intent-filteraction android:nameandroid.intent.action.MAIN /category android:nameandroid.intent.category.LAUNCHER /
/intent-filterandroid:label指定活动中标题栏的内容
android:labelThis is FirstActivity1.3 提醒小弹窗Toast
Toast是Android系统提供的一种非常好的提醒方式在程序中可以使用它将一些短小的信息通知给用户这些信息会在一段时间后自动消失并且不会占用任何屏幕空间。 下面这段代码我们一般放在点击事件里面 Toast.makeText(FirstActivity.this,“You clicked Button 1”,Toast.LENGTH_SHORT).show(); makeText()方法需要传入3个参数。
第一个参数是Context是Toast要求的上下文由于活动本身就是一个Context对象因此这里直接传入FirstActivity.this即可。第二个参数是Toast显示的文本内容。第三个参数是Toast显示的时长有两个内置常量可以选择Toast.LENGTH_SHORT和Toast.LENGTH_LONG。
1.4 顶部小菜单Menu
效果是在标题栏的右侧多了一个三点的符号这个就是菜单按钮。点击之后会显示多个我们定义好的菜单按键使用方式如下
新建菜单文件文件夹→New→Menu resource file编写菜单按钮在main.xml中添加代码
?xml version1.0 encodingutf-8?
menu xmlns:androidhttp://schemas.android.com/apk/res/androiditemandroid:idid/add_itemandroid:titleAdd/itemandroid:idid/remove_itemandroid:titleRemove/
/menu上面的代码建了两个菜单项其中标签就是用来创建具体的某一个菜单项然后通过android:id给这个菜单项指定一个唯一的标识符通过android:title给这个菜单项指定一个名称。 3. 给当前活动创建菜单回到FirstActivity中来重写onCreateOptionsMenu()方法重写的内容里面通过getMenuInflater()方法能够得到MenuInflater对象再调用它的inflate()方法就可以给当前活动创建菜单。
Overridepublic boolean onCreateOptionsMenu(Menu menu) {getMenuInflater().inflate(R.menu.main,menu);return true;}给菜单按钮编写逻辑处理在FirstActivity中重写onOptionsItemSelected()方法
Override
public boolean onOptionsItemSelected(NonNull MenuItem item) {if(item.getItemId() R.id.add_item)Toast.makeText(this,You clicked Add,Toast.LENGTH_SHORT).show();if(item.getItemId() R.id.remove_item)Toast.makeText(this,You clicked Remove,Toast.LENGTH_SHORT).show();return true;
}注意这里的代码和书上的不一样因为现在好像不能使用 case R.id.add_item了必须是一个静态常量才行所以我换成了if语句判断。这样写完后点击菜单按钮就会有不同的处理回应了。
1.5 销毁一个活动 finish()
销毁活动的方式有两种一种是按一下Back键另一种是通过代码 finish();
2. 活动之间的跳转
2.1 活动间的跳转Intent
Intent是Android程序中各组件之间进行交互的一种重要方式它不仅可以指明当前组件想要执行的动作还可以在不同组件之间传递数据。Intent一般可被用于启动活动、启动服务以及发送广播等场景。 Intent大致可以分为两种显式Intent和隐式Intent。
2.1.1 显式使用
在FirstActivity的中按钮的点击事件中加入以下代码 Intent intentnew Intent(FirstActivity.this,SecondActivity.class); startActivity(intent); 第一个参数是FirstActivity.this作为上下文 第二个参数是SecondActivity这个活动 这样就会在点击按钮时运行这段代码启动SecondActivity活动
2.1.2 隐式使用
它并不明确指出我们想要启动哪一个活动而是指定了一系列更为抽象的action和category等信息然后交由系统去分析这个Intent并帮我们找出合适的活动去启动。
在标签下配置的内容可以指定当前活动能够响应的action和category
intent-filteraction android:namecom.example.activitytest.ACTION_START /category android:nameandroid.intent.category.DEFAULT /category android:namecom.example.activitytest.MY_CATEGORY /
/intent-filter这时候的FirstActivity中按钮的点击事件中的Intent 要这么写
Intent intentnew Intent(com.example.activitytest.ACTION_START);
startActivity(intent);注意
这里的是在SecondActivity的标签里面哦表示的是SecondActivity活动可以响应Intent中指定的action和category中的内容同时能够匹配上和标签里面的内容的Intent。SecondActivity的category 可以指定多个匹配上一个就行FirstActivity的Intent 可以不指定category 这时会默认给一个DEFAULT的category 但是如果想换其他的category 就需要指定。
Intent intentnew Intent(com.example.activitytest.ACTION_START);
intent.addCategory(com.example.activitytest.MY_CATEGORY);
startActivity(intent);2.1.3 隐式Intent 的更多用法-跳转网页、拨打电话…
隐式Intent除了用于Activity跳转还可以用于拨打电话、发送短信、访问网页、调用音乐播放器、调用视频播放器、发送邮件和打开地图等。 拨打电话
//隐式Intent拨打电话
Intent intentnew Intent(Intent.ACTION_DIAL);
intent.setData(Uri.parse(tel:10086));
startActivity(intent);发送短信
//隐式发送短信
Intent intent new Intent(Intent.ACTION_VIEW);
intent.putExtra(这里填写短信收信人, 这里填写短信内容);
intent.setType(vnd.android-dir/mms-sms);
startActivity(intent);访问网页
//隐式Intent访问网页
Intent intentnew Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse(http://www.baidu.com));
startActivity(intent);调用音乐播放器
//调用音乐播放器
Intent intent new Intent(Intent.ACTION_VIEW);
Uri uri Uri.parse(file://sdcard/demo.mp3);
intent.setDataAndType(uri, audio/mp3);
startActivity(intent);调用视频播放器
//调用视频播放器
Intent intent new Intent(Intent.ACTION_VIEW);
Uri uri Uri.parse(file://sdcard/demo.mp4);
intent.setDataAndType(uri, video/mp4);
startActivity(intent);发送邮件
//发送邮件
Intent intent new Intent(Intent.ACTION_SENDTO);
intent.setData(Uri.parse(mailto:xxxgmail.com));
intent.putExtra(Intent.EXTRA_SUBJECT, 这是标题);
intent.putExtra(Intent.EXTRA_TEXT, 这是内容);
startActivity(intent);打开地图
//打开地图查看某经纬度的地点如天安门
Intent intent new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse(geo:39.9073,116.3912));
startActivity(intent);2.2 向下一个活动传递数据 intent.putExtra
Intent中提供了一系列putExtra()方法的重载可以把想要传递的数据暂存在Intent中启动了另一个活动后只需要把这些数据再从Intent中取出就可以了。 比如在FirstActivity中
button1.setOnClickListener(new View.OnClickListener() {Overridepublic void onClick(View view) {String dataHello SecondActivity;Intent intent new Intent(FirstActivity.this,SecondActivity.class);intent.putExtra(extra data,data);startActivity(intent);}
});使用显式Intent的方式来启动SecondActivity并通过putExtra()方法传递了一个字符串。注意这里putExtra()方法接收两个参数第一个参数是键用于后面从Intent中取值第二个参数才是真正要传递的数据。 然后在SecondActivity中将传递的数据取出并打印出来代码如下所示
public class SecondActivity extends AppCompatActivity {Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.second_layout);Intent intent getIntent();String data intent.getStringExtra(extra data);Log.d(SecondActivity,data);}注意
如果传递的是整型数据则使用getIntExtra()方法如果传递的是布尔型数据则使用getBooleanExtra()方法以此类推。
2.3 返回数据给上一个活动ActivityResultLauncher 实例
这一部分的内容需要注意书上给的例子是使用 startActivityForResult()但是在 Android 11API 级别 30及以后的版本中方法 startActivityForResult(Intent, int) 已经被弃用。尽管它仍然可以使用但为了确保兼容性和未来的应用程序发展建议使用新的替代方案。现在可以使用 ActivityResultLauncher API 来替代 startActivityForResult()。这个新的 API 提供了更灵活和现代的方式来处理活动结果。
声明 ActivityResultLauncher 在FirstActivity中声明一个 ActivityResultLauncher 对象。你需要指定你想使用的合同例如
ActivityResultContracts.StartActivityForResult()。
ActivityResultLauncherIntent myLauncher registerForActivityResult(new ActivityResultContracts.StartActivityForResult(),result - {if (result.getResultCode() RESULT_OK) {// 处理结果Intent data result.getData();// ...}}
);启动活动 现在不再使用 startActivityForResult()而是在 ActivityResultLauncher 实例上调用 launch() 方法来启动活动。下面的例子中我通过intent.putExtra传入了参数。
Override
public void onClick(View view) {Intent intent new Intent();intent.putExtra(data_return,Hello FirstActivity);setResult(RESULT_OK,intent);finish();
}处理结果 现在我要在FirstActivity提取我们传来的参数只需要修改声明 ActivityResultLauncher时候的代码
private final ActivityResultLauncherIntent myLauncher registerForActivityResult(new ActivityResultContracts.StartActivityForResult(),result - {if (result.getResultCode() RESULT_OK) {Intent data result.getData();//拿取传过来的数据if (data ! null) {String returnedData data.getStringExtra(data_return);if (returnedData ! null) {// 弹出提示框AlertDialog.Builder builder new AlertDialog.Builder(this);builder.setMessage(returnedData).setTitle(Returned Data).setPositiveButton(OK, null);AlertDialog dialog builder.create();dialog.show();}}}}
);通过String returnedData data.getStringExtra(“data_return”);拿到我们的数据再进行处理。 补充如果通过按下Back键返回呢 如果用户在SecondActivity中并不是通过点击按钮而是通过按下Back键回到FirstActivity我们可以通过在SecondActivity中重写onBackPressed()方法来处理返回的数据。
Override
public void onBackPressed() {Intent intent new Intent();intent.putExtra(data_return,Hello FirstActivity);setResult(RESULT_OK,intent);finish();
}在用户点击Back键的时候就会调用这个函数那么我们的intent.putExtra存进去的数据仍然可以传回去。
3. 活动的生命周期
3.1 返回栈
Android中的活动是可以层叠的。每启动一个新的活动就会覆盖在原活动之上然后点击Back键会销毁最上面的活动下面的一个活动就会重新显示出来。Android是使用任务Task来管理活动的一个任务就是一组存放在栈里的活动的集合这个栈也被称作返回栈Back Stack。系统总是会显示处于栈顶的活动给用户。 返回栈是如何管理活动入栈出栈操作的示意图
3.2 活动状态
每个活动在其生命周期中最多可能会有4种状态。
运行状态 当一个活动位于返回栈的栈顶时这时活动就处于运行状态。系统最不愿意回收的就是处于运行状态的活动因为这会带来非常差的用户体验。暂停状态 当一个活动不再处于栈顶位置但仍然可见时这时活动就进入了暂停状态。处于暂停状态的活动仍然是完全存活着的系统也不愿意去回收这种活动因为它还是可见的回收可见的东西都会在用户体验方面有不好的影响只有在内存极低的情况下系统才会去考虑回收这种活动。停止状态 当一个活动不再处于栈顶位置并且完全不可见的时候就进入了停止状态。系统仍然会为这种活动保存相应的状态和成员变量但是这并不是完全可靠的当其他地方需要内存时处于停止状态的活动有可能会被系统回收。销毁状态 当一个活动从返回栈中移除后就变成了销毁状态。系统会最倾向于回收处于这种状态的活动从而保证手机的内存充足。
3.3 活动的生存期
Activity类中定义了7个回调方法覆盖了活动生命周期的每一个环节下面就来一一介绍这7个方法。
onCreate()它会在活动第一次被创建的时候调用。你应该在这个方法中完成活动的初始化操作比如说加载布局、绑定事件等。onStart()在活动由不可见变为可见的时候调用。onResume()在活动准备好和用户进行交互的时候调用。此时的活动一定位于返回栈的栈顶并且处于运行状态。onPause()在系统准备去启动或者恢复另一个活动的时候调用。我们通常会在这个方法中将一些消耗CPU的资源释放掉以及保存一些关键数据但这个方法的执行速度一定要快不然会影响到新的栈顶活动的使用。onStop()在活动完全不可见的时候调用。它和onPause()方法的主要区别在于如果启动的新活动是一个对话框式的活动那么onPause()方法会得到执行而onStop()方法并不会执行。onDestroy()在活动被销毁之前调用之后活动的状态将变为销毁状态。onRestart()在活动由停止状态变为运行状态之前调用也就是活动被重新启动了。 以上7个方法中除了onRestart()方法其他都是两两相对的从而又可以将活动分为3种生存期。完整生存期活动在onCreate()方法和onDestroy()方法之间所经历的就是完整生存期。一般情况下一个活动会在onCreate()方法中完成各种初始化操作而在onDestroy()方法中完成释放内存的操作。可见生存期活动在onStart()方法和onStop()方法之间所经历的就是可见生存期。在可见生存期内活动对于用户总是可见的即便有可能无法和用户进行交互。我们可以通过这两个方法合理地管理那些对用户可见的资源。比如在onStart()方法中对资源进行加载而在onStop()方法中对资源进行释放从而保证处于停止状态的活动不会占用过多内存。前台生存期活动在onResume()方法和onPause()方法之间所经历的就是前台生存期。在前台生存期内活动总是处于运行状态的此时的活动是可以和用户进行交互的我们平时看到和接触最多的也就是这个状态下的活动。
3.4 活动回收后
想象以下场景应用中有一个活动A用户在活动A的基础上启动了活动B活动A就进入了停止状态这个时候由于系统内存不足将活动A回收掉了然后用户按下Back键返回活动A会出现什么情况呢 其实还是会正常显示活动A的只不过这时并不会执行onRestart()方法而是会执行活动A的onCreate()方法因为活动A在这种情况下会被重新创建一次。这样看上去好像一切正常可是别忽略了一个重要问题活动A中是可能存在临时数据和状态的。打个比方MainActivity中有一个文本输入框现在你输入了一段文字然后启动NormalActivity这时MainActivity由于系统内存不足被回收掉过了一会你又点击了Back键回到MainActivity你会发现刚刚输入的文字全部都没了因为MainActivity被重新创建了。因此我们引入了可以在活动回收后保存数据的方法onSaveInstanceState()回调方法这个方法可以保证在活动被回收之前一定会被调用因此我们可以通过这个方法来解决活动被回收时临时数据得不到保存的问题。
重写onSaveInstanceState()方法
Overrideprotected void onSaveInstanceState(Bundle outState) {super.onSaveInstanceState(outState);String tempData Something you just typed;outState.putString(data_key,tempData);}在onCreate()方法中加入判断
Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);Log.d(TAG,onCreate);setContentView(R.layout.activity_main);if (savedInstanceState!null) {String tempData savedInstanceState.getString(data_key);Log.d(TAG,tempData);}不过这里注意一点 onSaveInstanceState()方法它不是生命周期方法它不同于生命周期方法它并不会一定会被触发它只有具备以下条件的时候才会触发
当按下HOME键的时长按HOME键选择运行程序的时按下电源(关闭屏幕显示)时从Activity中启动其他Activity时屏幕方向切换时(例如从竖屏切换到横屏时) 如果想实现以上效果请使用屏幕方向切换(例如从竖屏切换到横屏时) Intent还可以结合Bundle一起用于传递数据首先可以把需要传递的数据都保存在Bundle对象中然后再将Bundle对象存放在Intent里。到了目标活动之后先从Intent中取出Bundle再从Bundle中一一取出数据。
4. 活动的启动模式
活动的启动模式一共有4种分别是standard、singleTop、singleTask和singleInstance可以在AndroidManifest.xml中通过给标签指定android:launchMode属性来选择启动模式。
4.1 四种启动模式
Standard标准模式
在这种模式下每次启动活动时都会创建一个新的活动实例。如果您多次启动同一活动将会创建多个不同的实例它们位于活动堆栈中的顶部。这是默认的启动模式。
SingleTop单顶模式
在这种模式下如果新活动的实例已经位于栈的顶部系统将重用该实例而不创建新的。如果新活动不在栈的顶部系统将创建新的实例并将其推入栈的顶部。这允许在同一活动的不同任务之间共享实例但在任务内仍然可以创建多个实例。
SingleTask单任务模式
在这种模式下对于同一个活动系统只允许一个活动实例存在于任务中。如果新活动已经存在于任务中系统将通过调用 onNewIntent() 方法来重新激活它而不会创建新实例。这通常用于定义应用的入口点例如主界面。
SingleInstance单实例模式
这是最特殊的启动模式每个活动实例都会独立存在于自己的任务中。即使是相同活动的不同实例也不会共享任务。这通常用于具有独立性的组件如电话应用中的来电界面。 每一个活动都可以单独设置启动模式但是当有不同的启动模式的时候会创建不同的返回栈也可以叫做任务栈Task Stack此时活动退出时候的顺序和活动启动的顺序可能不一样。当用户从一个活动退出时优先返回到该活动所属返回栈的栈顶活动。当该活动所属返回栈已经没有活动了时会返回到还存在活动的返回栈读取里面的活动
4.2 “任务”Task
在 Android 中“任务”Task是一种管理应用活动Activity的方式。一个任务通常包含一个或多个活动并用于组织和管理这些活动的生命周期。
任务栈Task Stack每个任务都有一个与之关联的活动栈它是活动实例的有序堆栈。当您启动一个新的活动时它将被推入栈的顶部。用户可以通过返回键按照栈的顺序导航回先前的活动。任务的启动任务可以从应用的入口点通常是主活动开始并随着用户与应用的互动而增长。您可以使用不同的启动模式来定义新活动如何与任务中的现有活动实例进行交互。任务之间的分离不同任务的活动通常是相互分离的它们不共享相同的任务栈。这意味着每个任务都有自己独立的活动堆栈。这在某些情况下很有用例如使用 singleInstance 启动模式的活动。任务的生命周期任务具有自己的生命周期当任务中的最后一个活动关闭时整个任务将被销毁。这可以在某些情况下用于应用的清理和管理。
5. 活动的最佳实践技巧
5.1 知晓当前是在哪一个活动
新建一个BaseActivity类创建时选择一个普通的Java类不需要在AndroidManifest.xml中注册。让BaseActivity继承自AppCompatActivity并重写onCreate()方法
public class BaseActivity extends AppCompatActivity {Overrideprotected void onCreate(Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);Log.d(BaseActivity,getClass().getSimpleName());}让BaseActivity成为ActivityTest项目中所有活动的父类 现在每当我们进入到一个活动的界面该活动的类名就会被打印出来这样我们就可以时时刻刻知晓当前界面对应的是哪一个活动了。
5.2 随时随地退出程序
用一个专门的集合类对所有的活动进行管理就可以随时随地都能退出程序而不需要一个一个注销和退出。
新建一个ActivityCollector类作为活动管理器
public class ActivityCollector {public static ListActivity 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();}activities.clear();}}
}在活动管理器中我们通过一个List来暂存活动然后提供了一个addActivity()方法用于向List中添加一个活动提供了一个removeActivity()方法用于从List中移除活动最后提供了一个finishAll()方法用于将List中存储的活动全部销毁掉。 2. 修改BaseActivity中的代码
public class BaseActivity extends AppCompatActivity {Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);Log.d(BaseActivity,getClass().getSimpleName());ActivityCollector.addActivity(this);}Overrideprotected void onDestroy() {super.onDestroy();ActivityCollector.removeActivity(this);}
}在BaseActivity的onCreate()方法中调用了ActivityCollector的addActivity()方法表明将当前正在创建的活动添加到活动管理器里。然后在BaseActivity中重写onDestroy()方法并调用了ActivityCollector的removeActivity()方法表明将一个马上要销毁的活动从活动管理器里移除。 从此以后不管你想在什么地方退出程序只需要调用ActivityCollector.finishAll()方法就可以了。例如在ThirdActivity界面想通过点击按钮直接退出程序 Button button3 (Button) findViewById(R.id.button_3);button3.setOnClickListener(new View.OnClickListener() {Overridepublic void onClick(View view) {ActivityCollector.finishAll();}});当然你还可以在销毁所有活动的代码后面再加上杀掉当前进程的代码以保证程序完全退出杀掉进程的代码如下所示
android.os.Process.killProcess(android.os.Process.myPid())其中killProcess()方法用于杀掉一个进程它接收一个进程id参数我们可以通过myPid()方法来获得当前程序的进程id。需要注意的是killProcess()方法只能用于杀掉当前程序的进程我们不能使用这个方法去杀掉其他程序。
5.3 启动活动的最佳写法
当我们启动一个活动需要两个特别重要的参数时可以使用以下办法 假设SecondActivity中需要用到两个非常重要的字符串参数在启动SecondActivity的时候必须要传递过来
public class SecondActivity extends BaseActivity {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.startActivity(intent);}......
}在SecondActivity中添加了一个actionStart()方法在这个方法中完成了Intent的构建另外所有SecondActivity中需要的数据都是通过actionStart()方法的参数传递过来的然后把它们存储到Intent中最后调用startActivity()方法启动SecondActivity。 这样写的好处就是SecondActivity所需要的数据在方法参数中全部体现出来了这样即使不用阅读SecondActivity中的代码不去询问负责编写SecondActivity的同事你也可以非常清晰地知道启动SecondActivity需要传递哪些数据。另外这样写还简化了启动活动的代码现在只需要一行代码就可以启动SecondActivity如下所示 在FirstActivity中
protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);Log.d(FirstActivity,Task id is getTaskId());setContentView(R.layout.first_layout);Button button1(Button) findViewById(R.id.button_1);button1.setOnClickListener(new View.OnClickListener() {Overridepublic void onClick(View view) {//Intent intent new Intent(FirstActivity.this,SecondActivity.class);//startActivity(intent);SecondActivity.actionStart(FirstActivity.this,data1,data2);}});
}
文章转载自: http://www.morning.thrcj.cn.gov.cn.thrcj.cn http://www.morning.sxbgc.cn.gov.cn.sxbgc.cn http://www.morning.lywys.cn.gov.cn.lywys.cn http://www.morning.wrtbx.cn.gov.cn.wrtbx.cn http://www.morning.llxns.cn.gov.cn.llxns.cn http://www.morning.lhgqc.cn.gov.cn.lhgqc.cn http://www.morning.wgqtt.cn.gov.cn.wgqtt.cn http://www.morning.ctlbf.cn.gov.cn.ctlbf.cn http://www.morning.ptqds.cn.gov.cn.ptqds.cn http://www.morning.ktdqu.cn.gov.cn.ktdqu.cn http://www.morning.sjwzl.cn.gov.cn.sjwzl.cn http://www.morning.qlpq.cn.gov.cn.qlpq.cn http://www.morning.pjwrl.cn.gov.cn.pjwrl.cn http://www.morning.wpwyx.cn.gov.cn.wpwyx.cn http://www.morning.pmrlt.cn.gov.cn.pmrlt.cn http://www.morning.wlfxn.cn.gov.cn.wlfxn.cn http://www.morning.ygkb.cn.gov.cn.ygkb.cn http://www.morning.krkwp.cn.gov.cn.krkwp.cn http://www.morning.rtlth.cn.gov.cn.rtlth.cn http://www.morning.drqrl.cn.gov.cn.drqrl.cn http://www.morning.xhwty.cn.gov.cn.xhwty.cn http://www.morning.bpmtg.cn.gov.cn.bpmtg.cn http://www.morning.fgxr.cn.gov.cn.fgxr.cn http://www.morning.kzqpn.cn.gov.cn.kzqpn.cn http://www.morning.kaylyea.com.gov.cn.kaylyea.com http://www.morning.gyylt.cn.gov.cn.gyylt.cn http://www.morning.nwjd.cn.gov.cn.nwjd.cn http://www.morning.kwqqs.cn.gov.cn.kwqqs.cn http://www.morning.zzhqs.cn.gov.cn.zzhqs.cn http://www.morning.lqgfm.cn.gov.cn.lqgfm.cn http://www.morning.xjpnq.cn.gov.cn.xjpnq.cn http://www.morning.hmdn.cn.gov.cn.hmdn.cn http://www.morning.zdxss.cn.gov.cn.zdxss.cn http://www.morning.jlgjn.cn.gov.cn.jlgjn.cn http://www.morning.tkjh.cn.gov.cn.tkjh.cn http://www.morning.ywrt.cn.gov.cn.ywrt.cn http://www.morning.tjkth.cn.gov.cn.tjkth.cn http://www.morning.nwclg.cn.gov.cn.nwclg.cn http://www.morning.gwqq.cn.gov.cn.gwqq.cn http://www.morning.skdhm.cn.gov.cn.skdhm.cn http://www.morning.qsmdd.cn.gov.cn.qsmdd.cn http://www.morning.fcwxs.cn.gov.cn.fcwxs.cn http://www.morning.rggky.cn.gov.cn.rggky.cn http://www.morning.bytgy.com.gov.cn.bytgy.com http://www.morning.sftpg.cn.gov.cn.sftpg.cn http://www.morning.zntf.cn.gov.cn.zntf.cn http://www.morning.jmspy.cn.gov.cn.jmspy.cn http://www.morning.gmztd.cn.gov.cn.gmztd.cn http://www.morning.lbpqk.cn.gov.cn.lbpqk.cn http://www.morning.lyldhg.cn.gov.cn.lyldhg.cn http://www.morning.hsjrk.cn.gov.cn.hsjrk.cn http://www.morning.myhpj.cn.gov.cn.myhpj.cn http://www.morning.bnqcm.cn.gov.cn.bnqcm.cn http://www.morning.mszls.cn.gov.cn.mszls.cn http://www.morning.rgxf.cn.gov.cn.rgxf.cn http://www.morning.hfnbr.cn.gov.cn.hfnbr.cn http://www.morning.lxlzm.cn.gov.cn.lxlzm.cn http://www.morning.xcxj.cn.gov.cn.xcxj.cn http://www.morning.qkxt.cn.gov.cn.qkxt.cn http://www.morning.cqrenli.com.gov.cn.cqrenli.com http://www.morning.ypmqy.cn.gov.cn.ypmqy.cn http://www.morning.kcxtz.cn.gov.cn.kcxtz.cn http://www.morning.jxwhr.cn.gov.cn.jxwhr.cn http://www.morning.tqhpt.cn.gov.cn.tqhpt.cn http://www.morning.tbrnl.cn.gov.cn.tbrnl.cn http://www.morning.sqhtg.cn.gov.cn.sqhtg.cn http://www.morning.zmqb.cn.gov.cn.zmqb.cn http://www.morning.plydc.cn.gov.cn.plydc.cn http://www.morning.nqlcj.cn.gov.cn.nqlcj.cn http://www.morning.mtyhk.cn.gov.cn.mtyhk.cn http://www.morning.jfnlj.cn.gov.cn.jfnlj.cn http://www.morning.trzmb.cn.gov.cn.trzmb.cn http://www.morning.ltypx.cn.gov.cn.ltypx.cn http://www.morning.rbgqn.cn.gov.cn.rbgqn.cn http://www.morning.wlbwp.cn.gov.cn.wlbwp.cn http://www.morning.btwlp.cn.gov.cn.btwlp.cn http://www.morning.tkrwm.cn.gov.cn.tkrwm.cn http://www.morning.qfkxj.cn.gov.cn.qfkxj.cn http://www.morning.hwpcm.cn.gov.cn.hwpcm.cn http://www.morning.splkk.cn.gov.cn.splkk.cn