2021@SDUSC
webview项目剩余代码分析
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.b_activity_main);
webView=findViewById(R.id.webview_b);
String data="<!doctype html>\n" +
"<html><head><meta charset=\"utf-8\"><title>无标题文档</title></head>\n" +
"<body><h1>hello world</h1></body>\n" +
"</html>\n";
webView.loadData(data,"text/html","utf-8");
}
这是项目的另一个加载网页的类,规定了网页的布局,然后加载一个无标题网页,比较简单。
webview项目总结
项目主要介绍了如何在Android加载网页功能,通过部分代码演示了如何简单加载一个网页,可以使教学网站使用者较快掌握简单的网页加载方法,简单明了适合初学者。
Android主要组件补充
Intent未涉及部分说明
Intent 是一个消息传递对象,可以用来从其他应用组件请求操作。项目中多次使用Intent传递组件间消息。可以通过多种方式促进组件之间的通信。下面代码是音乐播放器项目中使用Intent传递切换组件类的信息。
if(v.getId() == R.id.btn_backlist){
unbind(isUnbind);
isUnbind = true;
Intent intent3 = new Intent();
intent3.setClass(MusicActivity.this, Music_List.class);
startActivity(intent3);
}
下面是传递消息的过程:
name = intent1.getStringExtra("song_name");
singer = intent1.getStringExtra("singer");
//写入TextView中
thesong_name.setText(name);
thesong_singer.setText(singer);
//创建意图对象
intent2 = new Intent(this, MusicService.class);
分类:
显式Intent:通过组件名指定启动的目标组件,比如startActivity(new Intent(A.this,B.class)); 每次只会启动一个组件。
隐式Intent:不指定组件名,而指定Intent的Action,Data,或Category,当我们启动组件时, 会去匹配AndroidManifest.xml相关组件的Intent-filter,逐一匹配出满足属性的组件,当不止一个满足时, 会弹出一个对话框,选择启动哪一个组件。
使用方法:
1、启动 Activity
Activity 表示应用中的一个屏幕。通过将 Intent 传递给 startActivity() ,可以启动新的 Activity实例。Intent 用于描述要启动的 Activity,并携带任何必要的数据。
如果希望在 Activity 完成后收到结果,可以调用 startActivityForResult() 。在 Activity 的onActivityResult() 回调中, Activity 将结果作为单独的 Intent 对象接收。
2、启动服务
Service 是一个不使用用户界面而在后台执行操作的组件。通过将
Intent 传递给 startService() ,可以启动服务执行一次性操作(例如,下载文件)。Intent 用于描述要启动的服务,并携带任何必要的数据。如果服务旨在使用客户端-服务器接口,则通过将 Intent 传递给 bindService() ,可以从其他组
件绑定到此服务。
3、传递广播
广播是任何应用均可接收的消息。系统将针对系统事件(例如:系统启动或设备开始充电时)传递各种广播。通过将 Intent 传递给 sendBroadcast() 或 sendOrderedBroadcast() ,可以将广播传递给其他应用。
Intent过滤器
Intent 过滤器是 manifests 里组件的子标签,一个控件可以声明一个或者多个Intent 过滤器,只要其中一个通过匹配,该组件就可以相应相应 Intent。下面是官网的一个例子:
<activity android:name="MainActivity">
<!-- 应用的首页面,会显示在启动器中 -->
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name="ShareActivity">
<!-- 该活动可以处理 SEND这个 aciton,且处理数据类型为无格式文本 -->
<intent-filter>
<action android:name="android.intent.action.SEND"/>
<!--需要响应隐式Intent的活动必须添加 android.intent.category.DEFAULT这个分类,因为starActivity()方法会默认为Intent添加-->
<category android:name="android.intent.category.DEFAULT"/>
<data android:mimeType="text/plain"/>
</intent-filter>
<!-- 此为同一个 Activity 的第二个过滤器 该活动可以处理 "SEND" 和 "SEND_MULTIPLE"两种 aciton 处理数据类型为多媒体数据(包括图片、视频和全景照片) -->
<intent-filter>
<action android:name="android.intent.action.SEND"/>
<action android:name="android.intent.action.SEND_MULTIPLE"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:mimeType="application/vnd.google.panorama360+jpg"/>
<data android:mimeType="image/*"/>
<data android:mimeType="video/*"/>
</intent-filter>
</activity>
使用注意事项:
1 、Intent 只能有1个 action,而 Intent 过滤器可有多个 action。
2、 需要响应隐式 Intent 的 Activity 的 Intent 过滤器中必须添加 android.intent.category.DEFAULT这个分类。
3 、data 在构造时传入的是 URI对象以及 mimeType 字符串,mimeType 的对应关系比较直观不详述,Uri 对象会被分为 4 个部分 (<协议>://<主机名>:<端口>/<路径>)。
4 、path 和 mimeType 允许使用*通配符,实现部分匹配。
5、 对于所有 Activity,必须在清单文件中声明 Intent 过滤器。但是,广播接收器的过滤器可以通过调用 registerReceiver() 动态注册。 且可以使用 unregisterReceiver() 注销该接收器。这样一来,应用便可仅在应用运行时的某一指定时间段内侦听特定的广播。
判断是否非空:
当隐式 Intent 发出而找不到匹配 Activity 时,调用将会失败,且应用会崩溃。要验证是否存在会接收 Intent 的 Activity ,可以对 Intent 对象调用resolveActivity()。如果结果为非空,则至少有一个应用能够处理该 Intent,且可以安全调用 startActivity()。 如果结果为空,则不应使用该 Intent,应停用发出该 Intent 的功能。
Intent sendIntent = new Intent();
sendIntent.setAction(Intent.ACTION_SEND);
sendIntent.putExtra(Intent.EXTRA_TEXT, textMessage);
sendIntent.setType("text/plain");
// 判断是否存在能够匹配该 Intent 的 Activity
if (sendIntent.resolveActivity(getPackageManager()) != null) {
startActivity(sendIntent);
}