恐怖邮轮(有剧透!没看过的建议先观看电影!也可以直接目录跳转相关知识点)
1.到达船坞,众人出海(页面跳转,数据传递)
一个风和日丽的下午,洁西被朋友邀请出海航行,但冥冥中她总觉得,周围的一切都充满奇怪的熟悉感。
她收拾好东西,透过窗户,孩子正在涂涂画画。
匆忙收拾好洒在地上的墨水
有人按她家的门铃,她却不知道是谁,出门问了Jack老大爷,他说没看到。
四处透露着莫名的诡异。
故事开始了
工程只要包含Activity,那么在启动这个应用的时候都需要指定一个启动页作为初始页。也就是我们打开app第一眼看到的页面。
我们需要在AndroidMainfest.xml中来指定那个活动作为启动页。具体的方式如下:
<activity android:name=".Login">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
杰西驱车来到了船坞,和葛雷一行人会面。
1.1驱车前往:Intent
Intent主要用于在组件中进行跳转或者传递数据,在这里我们用到了跳转活动和传递数据
活动由 由家到达船坞 intent这个小车载着数据 杰西来到了船坞
这个小车我们要如何实现呢?
Intent intent=new Intent(HomeActivity.this,DockActivity.class);
这就是小车了,这个小车的作用就是从家到船坞
那么光车去了也不行,杰西也得跟着去呀。
1.2杰西上车:putExtra
String name="杰西";
intent.putExtra("data",name);
可以通过intent.putExtra()
来为intent携带数据。当然还有其他的方式来实现。以后慢慢会接触到。
然后杰西上车后,
车子启动:startActivity(intent)
satrtActivity(intent)
于是绑定控件后完整的代码如下:
Button red_car=findViewById(R.id.button1);
red_car.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=new Intent(Login.this,MainActivity.class);
String name="杰西";
intent.putExtra("data",name);
startActivity(intent);
}
});
杰西到达船坞,此时在船坞中,葛雷(杰西的朋友),维克多(葛雷的室友),莎莉(葛雷的朋友),东尼,海瑟(莎莉的朋友)已经到达了船厂。
public class DockActivity extends AppCompatActivity {
String person="目前在船厂有葛雷,维克多,萨利,东尼,海瑟,";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_dock_activity);
final TextView text=findViewById(R.id.textView3);
text.setText(person);
}
}
1.3杰西下车:在跳转后的界面取数据
如果我们要在跳转后的界面进行取数据的操作可以使用以下代码:
Intent intent=getIntent();
String jess=intent.getStringExtra(“data”);
其中data就是我们在跳转时填写的变量。是唯一的
Button out_car=findViewById(R.id.button);
out_car.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=getIntent();
String jess=intent.getStringExtra("data");
person=person+jess;
text.setText(person);
}
});
在这里我们将下车绑定在控件上,用点击监听事件触发下车这个动作。
杰西下车
此时船坞的所有人全部到齐了
葛雷看到杰西来到船坞,前来打招呼(杰西是个单亲妈妈,这个葛雷其实对杰西有意思=。=)
杰西的状态不是很好,葛雷非常体贴,说:我们可以换个日子,但是杰西却坚持出海了。
于是,他们一同又一次踏上了死亡之旅。
等等。。
为什么要用 “又”?
2.遭遇风暴,邮轮获救(数据回传(请求与获取))
船只在海面上平稳的航行,杰西躺在船舱内的床上,她梦到了一个场景,她被冲到岸边,撕碎的衣服被海浪肆意翻卷。
突然她从梦中醒来。
暴风雨之前总是平静的,一刹那,风停。船只停留在海面上,仿佛静止。
后大风骤起,海面挂起狂风。暴风雨来了
2.1数据回传(请求)tips:正确的逻辑顺序为2.1->3.2->2.2
在狂风骤雨之中,葛雷的船发出了求救信号,但是却收到了一个奇怪的回复(注意,数据回传)
“我们需要求救,有船只能够救援吗?“
通过startActivityForResult(Intent intent,requestCode int);来传递一个信号,根据requestCode来匹配获得下个活动处理后得到的数据。
Intent intent=new Intent(DockActivity.this,CruiseActivity.class);
String data="我们需要求救,你们的船只位置哪里?";
intent.putExtra("help",data);
startActivityForResult(intent,1);
在这里发出的请求就是 requestCode=1;当有船只收到这个quest的时候可以处理这个请求。
之后葛雷却收到了一个奇怪的回复:“help me!!!(随后信号混乱,中断)”
那么我们在这里是如何接受这个回复并处理回复带的数据的呢??
我们在回传活动的部分需要重写onActivityResult方法来处理收到的数据。在这里使用到了三个参数,第一个就是requstCode, 就是我们发出的1,用来判断是不是回复我们的,
第二个参数是resultCode,用来判断是不是成功回复了,也就是能不能接通。第三个data,用来判断内容。
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
switch (requestCode)
{
case 1:
if(resultCode==RESULT_OK)
{
String respond=data.getStringExtra("request");
}
}
}
2.2数据回传(获取)
在这里有船只收到了葛雷的信息,并且给与了回复,回复的内容是这样的“help me!!”
随后,船只禁受不住飓风,倾覆了,众人落水,海瑟由于想撩男主被海浪卷走了。领盒饭
剩下的人获救,但是船只损坏了。活动结束
后众人遇到了噩梦的开端 AEOLUS邮轮
众人发现这个邮轮上有人在观察他们,但是一闪而逝。
随后登船获救
Button save=findViewById(R.id.button6);
save.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=new Intent(DockActivity.this,CruiseActivity.class);
intent.putExtra("data1","葛雷,杰西,维克多,萨利,东尼");
startActivity(intent);
finish();
}
});
3.众人遇难,杰西发现黑衣人(保存临时数据与数据回传(发送数据))
登上船只后,杰西对这个地方的熟悉感越发的强烈。但此时她不知道的是,一个黑衣人已经虎视眈眈,想要杀掉他们所有人。
3.1始终存在的黑衣人:如何保存活动内的临时数据防止切换页面在切回导致的数据消失?
我们需要在活动内重写savedInstanceState方法来保存我们想要保存的临时数据。在方法内部使用outState中的putString方法来保存字符串类型的数据,其他数据同理。
@Override
protected void onSaveInstanceState(@NonNull Bundle outState) {
super.onSaveInstanceState(outState);
String drakkiller="黑衣人";
outState.putString("darkkiller",drakkiller);
}
如果我们要调用保存的临时数据可以在onCreate方法中书写如下代码:
if(savedInstanceState!=null)
{
String darkkiller1=savedInstanceState.getString("darkkiller");
## 利用数据 ##
}
杰西不好的预感越发强烈
然而事实也是如此,再此之后,朋友们接连被一个蒙面的黑衣人杀害,其中有人发现这个想要杀掉他们的人竟然是杰西,于是当朋友们来找说法的时候,杰西蒙了,并极力否认并不是她。
场面血腥,不过分描述。请自行观看=。=
杰西在船舱找到了通讯室,于是向外发出了求救信号。(注意,数据回传)
之后当杰西与黑衣人碰见的时候,体内的战士之魂爆发了
最后反杀了黑衣人,但是当黑衣人坠入海中前,她说出了一句让人难以理解的话:
“你必须要杀掉他们,这是回家的唯一方法,杀了他们,杀了他们,杀了他们!”
杰西以为这是结束,但她不知道的是,这才是刚刚开始。
当她关掉音乐盒却听到了呼救声音,这时候她惊诧的发现…
这是她们落海时呼救的场景!
一切又来了一遍,这是这次,她成了船上的人。
此时她明白了一件事,当时在船舱内收到的奇怪求救信号,就是她在船舱内呼救发出的!
3.2轮回的呼救信号:数据回传(发送数据)
这时候一切都清楚了,当初在船内的信号就是她发出的,而这个回复,回传到小船上的信号,是这样实现的。
Intent intent=new Intent();
intent.putExtra("requset","help me!!");
setResult(RESULT_OK,intent);
finish();
跳转后的界面如果向向前一个界面回传数据,需要以下两个参数,resultCode和data,也就是处理结果以及附带的数据。这里用setResult来将结果与数据传递回上一个活动。这里的Intent()不参与页面跳转,只进行数据的传递。
3.3总结一下数据回传
数据回传的过程其实就是 需要回传数据的活动发送一个requsetCode,然后收到这个requsetCode的活动根据收到的信息处理数据并给于反馈,反馈包括处理结果resultCode和返回的处理数据。然后我们需要在需要回传数据的活动内重写onActivityResult方法来处理收到的数据。
4.无限的轮回(知晓当前启动的活动)
此时的她心灵收到了极大地冲击,满脑子都是一句话“只有杀掉他们你才能回家”
她的儿子还在家等她,为了她的儿子,她蒙上了面,拿起了武器。开始了新的一次轮回。
她没有反应过来的是,此时她已然成为了那个黑衣人。于是她展开了行动
当她再一次杀掉除了杰西的所有人后,她悲哀的发现,自己成为了那个被杀掉的人。
当杰西再次醒来,她发现她又一次回到了船上,然而这次,她发现地上都是重复的一张张纸条,写满了杀掉他们,在那个她不经意掉落吊坠的下水井,竟然满都是吊坠
这就告诉我们一件事,当活动比较多的时候,需要知道启动了那个活动并且能够对活动进行管理。
4.1这究竟是哪一次轮回!:如何知晓当前在哪一个活动
当活动比较多的时候,我们可以需要来很好的分辨现在处于哪个活动当中。为此我们需要创建一个BasicActivity类,然后去继承AppCompatActivity类,在BasicActivity内实现提示我们所处类的方法。
重写onCreat方法
首先创建一个BasicActivity,然后继承AppCompatActivity类
public class BasicActivity extends AppCompatActivity
然后我们重写onCreate方法来显示我们所在的活动位置。
Log.d("BasicActivity",getClass().getSimpleName());
通过这个代码可以在Logcat内看到我们当前所处的活动。
每当我们创建一个活动的时候,都去继承BasicActivity
当我们运行至此活动时就会显示。
2020-03-21 23:02:27.476 20117-20117/com.example.firstacitivity D/BasicActivity: DockActivity
2020-03-21 23:02:48.223 20117-20117/com.example.firstacitivity D/BasicActivity: CruiseActivity
5.无法终结的轮回(如何终结掉所有活动直接退出)
她终于明白了一件事,这是一个轮回,只有她逃脱邮轮才有希望摆脱这玩笑一般的厄运。于是她不断地重复之前的过程,在船头堆满了她,或者说以前的她的尸体。
天晓得她已经来过这里多少次了,只有能够逃脱这里她才能够回去见到自己的儿子!
作为黑衣人的她落到水里,也没有死。她在沙滩上醒来,梦中的情节再次出现。
她被冲到岸边,撕碎的衣服被海浪肆意翻卷。
她知道自己成功了,她回到了陆地上!
她为了自己的儿子拼命地回到家看到儿子依旧在画画,熟悉的画面涌上心头,坚强的杰西哭了TAT
但是在之后却亲眼看到了自己因为自闭症儿子把她买的船扔到水池里而被狠狠的责骂,原来这一切都是曾经发生过得,她在之前是个不折不扣的暴力狂
她看到了自己因为孩子打翻墨水而大打出手
她努力了这么久但她不是一个好妈妈,但经历了这么多让他对儿子充满了愧疚和爱,于是她杀了自己。
然后她抱着孩子说:
但是其实殊不知,
这
才是刚刚开始。
5.1 所以到底该怎么终结这个轮回?!:一键结束所有活动
如果想要结局,那么用代码真的很简单。
我们只需要创建一个ActivityControl类然后书写以下代码
public class ActivityControl {
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 removeAllActivity()
{
for (Activity activity:activities)
{
if(!activity.isFinishing())
{
activity.finish();
}
}
activities.clear();
}
}
在这里我们定义了一个列表来储存所有的活动,然后定义了增加活动,移除活动以及结束所有活动的方法。
然后我们在以上的基础上加入到BasicActivity类中,重写onDestroy方法和onCreat方法。
public class BasicActivity extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d("BasicActivity",getClass().getSimpleName());
ActivityControl.addActivity(this);
}
@Override
protected void onDestroy() {
super.onDestroy();
ActivityControl.removeActivity(this);
}
}
接下来当我们需要在某个界面结束掉所有活动的时候,只需要调用一下以下代码就可以实现一键关掉所有活动了!!!
ActivityControl.removeAllActivity();
这个电影真的很好看!希望看过的朋友们有时间能够在去重温一下!里面的很多细节我记不住了有的地方可能有偏差,希望大家不要怪罪。没有看过的朋友们我不希望你们看到这句话!因为这就代表你们看到了剧透!!!!如果想要小demo了解这几个实现的具体细节可以私信我,最后希望大家能边看边学,掌握关于活动的一些使用技巧。下期再见!