从来没写过日记,一直太忙了,没有时间闲下来,总在效率和深度上摇摆,然后还是妥协的选择了效率。
然而最近去参加面试,遇到两个面试官很年轻,问到的问题都是很细节的东西,自己以前知道或者明明了解过,却脑袋一片空白,才知道细节决定成败。之前的效率还是不牢靠的。
面试真是一个快速了解的过程,通过和其他人交手,就会露出破绽。
学到很多。
世界这么大,我还有很多理想没有完成。
它们的主页:http://www.ttigame.com/
希望半年后可以做出他们的东西出来。。。。
首先是四大组件之一的Activity(viewDetcter),它是用于展示界面的和用户交互,它可以显示一些控件(view的显示流程),也可以监听并处理用户的事件并做出响应(观察者模式).
这个有点像web中的主页面和主页面里面点击超链接跳转到其他界面。
首先做一个Activity:
1.要定义继承Activity
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView (R.layout.activity_main);
}
2.在AndroidManifest.xml的application节点中声明<Activity>
清单文件的重要参数
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<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>
application:中lable是指程序的名字,在卸载页面显示的名字就是这个lable指定的。
Activity中的lable是指activity的名字,
Action:指定操作的动作
Category:指定意图的类别, Launcher是在桌面创建快捷方式。CAR_DOCK,CAR_MODE就和车载相关
如果此activity还指定了:以下intentfilter,那么这个界面就会在桌面创建快捷方式,快捷方式名字就是这个activity的lable
<intent-filter>
<action android:name="android.intent.action.MAIN" />代表应用程序的入口界面
<category android:name="android.intent.category.LAUNCHER" />代表桌面上的快捷方式
</intent-filter>
Tips:
- 去掉Activity应用程序就没有界面了
- 删除intent-filter节点 对应的Activity界面就看不到了,就被隐藏掉了
- 可以有多个intent-Filter见系统源码中browser.
- activity的xml文件,一般尽量以activity_xxx.xml来命名
一个应用程序可以在桌面上产生多个快捷图标
增加第二个Activity,在清单文件里也配成action.MAIN;category.LAUNCHER就会在桌面上出现两个图标
Tips:比如Android系统中的联系人和拨号应用就是同一个应用对应着不同的快捷图标
A界面跳转B并传递数据 –intent
如果没有在清单文件中声明intent-filter跳转的时候Activity就会报ActivityNotFindException.
new 一个 intent,startActivity(intent);
有两种跳转的方法
显式意图
根据intent的有参构造函数Intent.Intent(Context packgeContext ,Class <?> cls字节码 );
优点:代码编写简单,不需要在清单文件中配置 意图过滤器 intent-filter,效率很高。
缺点:代码的耦合性比较强。高内敛 低耦合。
应用场景: 自己应用程序开启自己的界面 推荐使用显示意图。
1.1 Intent intent = new Intent();
intent.setClassName("com.intent",
"com.intent.SecondActivity");//类名必须是全路径
startActivity(intent);
1.2 Intent intent = new Intent(this,SecondActivity.class);
startActivity(intent);//方便的写法
隐式意图
在代码里面设置intent的action和data,框架通过解析清单文件找到Activity然后开启
// 跳转到第二个界面
Intent intent = new Intent(); intent.setAction("com.itheima.rpcalc.CALC"); intent.setData(Uri.parse("calc://"+et_name.getText().toString()));
startActivity(intent);
应用场景:开启别人应用程序的界面隐式意图.自己的某个界面,想让别的应用程序开启
//显示意图 不需要配置IntentFilter
Intent intent = new Intent(MainActivity.this, Main2Activity.class);
intent.setData(Uri.parse("calc://" + name));
startActivity(intent);
finish();
对应的
String data = getIntent().getData().toString();
data = data.replace("calc://", "");//因为这个的结果是calc://data
//隐式意图 需要配置IntentFilter
Intent intent = new Intent();
intent.setAction(".Main2Activity");
intent.setData(Uri.parse("rp://" + name));
startActivity(intent);
finish();
清单文件:
<activity
android:name=".Main2Activity"
android:label="@string/title_activity_main2">
<intent-filter>
<action android:name=".Main2Activity" />
<data android:scheme="rp" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
获得数据
String data = getIntent().getData().toString();
data = data.replace("rp://", "");
result.setText(data);
之前做过 调用打电话的intent Intent.Action_Call点击看源码就知道 其实是一个字符串
如果要自定义意图,就添加intent filter意图过滤器
`这个就是自定义的,当然可以任意命名,但是实际上我们一般的命名规则是包名.类名.意图的意思.方便辨认。
这个是系统的如果要自定义的话就要在声明一个在Activity中 <data android:scheme="calc"/>
然后再获取数据intent.getData获取数据再toStirng把uri转成字符串 得到传来的值是calc://edittext的内容
那再data.subString(“/”) 来 ,但是这样如果名字有前缀怎么办?
就用data.replace()
其实每个姓名每个中文字符用一种编码转化为int类型的数值,加起来100求余可能是正的可能是负数就取绝对值,就得到0~100之间的数值。