在Android中,除了像前面我们说的弹出指定页面,系统还提供了一个机制,就是跨程序调用,这样可以大大提高系统复用度,比如,我们自己写一个打电话程序,我们可以调用系统中自带的电话薄选择页面来实现;一个文本内容,我们可以写一个文本编辑器来修改,也可以用系统自带的文本工具来操作,就像在windows,可以用记事本打开一个txt也可以用word来操作一样。
对于这样的跨程序调用,Android中并没有采用定位程序再定信程序集中的界面来实现,而是采用类似于婚介所的形式,在系统我们安装一个apk程序后,系统会自动把里面的activity信息加载到系统的一个列表中,这个列表记录着Activity的名称,描述,数据格式等信息,另一个程序如果想调用系统中其他程序的界面时,只要向系统(婚介所)提供我需要的Activity(对象)的描述,由系统去筛选这个Activity,然后把结果(Intent)交给你的程序来处理。
首先看一下,怎样写一个Activity登记到这个系统中(婚介所),在前面我们就说过,一个程序都配有一个manifest.xml的装箱单,那发布这个Activity也是在这个文件中,看下面的代码:
<application……
<activity android:name=".TestActivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.PICK"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:path="tttt"
android:scheme="Test">
</data>
</intent-filter>
</activity>
</application>
在这个Application结点下面,可以定义Activity,当然是可以定义多个的,name:指定了具体的类;intent-filter:就是发布这个Activity的相关描述信息,主要有:
l Action:
是activity的动作类型,在系统中,已为我们定义了一些动用类型,这类型主要是将Activity进行分类,比如有ACTION_VIEW, ACTION_EDIT, ACTION_MAIN, ACTION_PICK等等。举例来说,我们写一个电话薄程序,可以有查看,编辑,选择的功能,那么其他系统调用我这个包后,具体想要用其中的哪一个功能就只要传入这样的参数就可以了。
l Category:
描述action的附加信息,主要描述了这个Activity的执行环境(个人觉得,有点不确定),比如指定一个activity只能是启动时用,或只能在弹出界面中用等等。
l Data:
这块主要是描述了数据传递格式,个人觉得里面还包含了该Activity的启动路径,比如,上例中,我们就要用“Test://tttt”来启动这个Activity。具体可看下面。
在发布了Activity之后,我们就要想到怎样使用,代码很简单,如下:
Uri uri = Uri.parse("Test://tttt/");
Intent intent = new Intent(Intent.ACTION_PICK, uri);
startActivityForResult(intent, 1);
使用时,我们定义Uri来定位到需要的Activity,然后创建Intent,然后直接启用即可。如果说系统中检测到有多个Activity满足你这个Intent要求,那么系统会自动弹出一个选择列表,让你选择一个具体的处理类,就象让你选择用记事本还是Word一样,当然在系统中,可以指定一个默认的处理类,可以不用弹出来选了。
其实,除了这种启动方法外,我们还有一种比较隐藏的应用,比如,收到一条短信,在这短信里有一个电话号码,和一个网址,我想实现,将这电话号码和网址变成超链接,点击后分别进行拨号和查看网页内容。
这样的程序其实也不难,在Linkify提供了这样的功能,看代码:
TextView textView = (TextView)findViewById(R.id.myTextView);
Linkify.addLinks(textView, Linkify.WEB_URLS|Linkify.EMAIL_ADDRESSES);
XML中:
<TextView
android:layout_width=”fill_parent”
android:layout_height=”fill_parent”
android:text=”@string/linkify_me”
android:autoLink=”phone|email”
/>
这样,我们的textView就可以自动识别出来网址格式和Email格式了,当点击时,其实也就是自动根据内容产生一个Uri,然后再Call出相应的Activity来处理。
总的看下来,这种隐式调用的方法,就像信息传递一样,我发起一个请求,对应的程序来处理,其实这处理方式也就是Android系统中的BroadCast(广播),消息传递机制,就是说把传递的内容当成消息,Activity为接受程序。
消息发送程序写法:
public static final String NEW_LIFEFORM_DETECTED =
"com.zjf.AndroidStudyBroadcast.NEW_LIFEFORM";
Intent intent = new Intent(NEW_LIFEFORM_DETECTED);
//intent.putExtra(“lifeformName”, lifeformType);
sendBroadcast(intent);
消息接受程序写法:
public class Receiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
}
}
然后将Receiver在系统的manifest.xml中注册:
<receiver android:name="Receiver">
<intent-filter>
<action android:name="com.zjf.AndroidStudyBroadcast.NEW_LIFEFORM"/>
</intent-filter>
</receiver>
当然除了通过定义来注册,也可以通过代码来注册:
IntentFilter filter = new IntentFilter(NEW_LIFEFORM_DETECTED);
LifeformDetectedBroadcastReceiver r = new LifeformDetectedBroadcastReceiver();
registerReceiver(r, filter);
通过unregisterReceiver(r);来注销监听。
在系统中提供了一系列的默认的事件,比如来电话,来短信,电池不足等,都可以用类似的方法来接收处理。
最后一种界面形式就是对话框,这种界面主要就是弹出的确认框啊,选择界面之类的,它并没有占屏幕的全部,但是这个界面的生命期完全由父控件来操作管理。实现对话框主要通过以下几种方式来实现:
(一) 继承Dialog来处理
Dialog d = new Dialog(MyActivity.this);
// Have the new window tint and blur the window it
// obscures.
Window window = d.getWindow();
window.setFlags(WindowManager.LayoutParams.FLAG_BLUR_BEHIND,
WindowManager.LayoutParams.FLAG_BLUR_BEHIND);
d.setTitle(“Dialog Title”);
d.setContentView(R.layout.dialog_view);
TextView text = (TextView)d.findViewById(R.id.dialogTextView);
text.setText(“This is the text in my dialog”);
d.show();
(二) 通过Activities用上dialog皮肤来实现
<activity android:name=”MyDialogActivity”
android:theme=”@android:style/Theme.Dialog”>
</activity>
(三) Toasts
这种方式是用于后台服务发出的提示信息。这个用法以后等学了服务再来了解吧
分享到:
相关推荐
androdi调用js函数,js调用android函数
android原生与js互调 android原生与js互调 android原生与js互调
android与JS互调,android与JS互调,android与JS互调
Android与js互调的Demo,希望可以帮助到大家! 对应博客地址:http://blog.csdn.net/qq_34947883/article/details/77990527
1.本文采用的是android调用assest中的本地.html文件,webview展示(加载网络的html效果是一样的,把url替换掉就行) 2.包含本地.html文件加载,点击.html控件,Android端响应 3.包含本地.html文件加载,点击.html...
第三版: 集成友盟和JS和Android的Native方法互调 【豪华测试版】 豪华: 自定义测试面板 可以调用系统短信和邮件等系统应用; JS和Android的Native方法互调用所有情况测试 亲测!可用! 用于Android和...
第二版: 集成友盟和JS和Android的Native方法互调 JS和Android的Native方法互调用所有情况测试 亲测!可用! 用于Android和HTML5混合开发中壳子的使用 后续将加入: Java类结构 和 Js库基本命名规则和...
Android与H5互调
java和js互调
Android 中通过WebView和HTML实现JS交互 Android(Java)与JavaScript(HTML...2) Android(Java)调用HTML中js代码(带参数) 3) HTML中js调用Android(Java)代码 4) HTML中js调用Android(Java)代码(带参数)
Android与H5互调详细介绍 微信,微博,微商,QQ空间,大量的软件使用内嵌了H5,这个时候就需要了解Android如何更H5交互的了;有些外包公司,为了节约成本,采用Android内嵌H5模式开发,便于在iOS上直接复用页面,...
这个demo实现了,在java代码中加载js,而在js代码中有调用了java的代码
JsAndroid简单互调
Android与Js互调,Java和Js互相调用例子,博客地址:https://blog.csdn.net/dreams_deng/article/details/104738687
android与Js互调源码,切记不能导入project,只能导入module 更多查看我的博客:https://blog.csdn.net/xiayiye5/article/details/97025136
android与Js互调源码,切记不能导入project,只能导入module 更多查看我的博客:https://blog.csdn.net/xiayiye5/article/details/97025136
Android和Cocos2dx间互调的方法,C++调用Java弹窗,迁移等
android ndk开发互调示例demo:包括java代码调用C,及C调用java。
cocos2d-x 通过JNI实现c/c++和Android的java层函数互调, 本文主要实现两个功能: (1)通过Android sdk的API得到应用程序的包名(PackageName),然后传递给c++层函数。 (2)通过c++函数调用Android的java层函数,显示一...
android js 互调