为了方便进行系统级别的消息通知,Android有一套类似广播的消息机制,每个应用程序都可以对自己感兴趣的广播进行注册,这样该程序就只会接收自己所关心的广播内容,这些广播可能是来自于系统,也可能是来自于其他程序。

先区分两个概念:广播和广播接收器

广播是由系统或者程序发出,广播中包含某些数据或者信息。

广播接收器是一个继承了BroadcastReceiver的类,用来接收广播并做出相应响应或处理。

广播可以分为两种类型:有序广播、有序广播

标准广播是一种完全异步执行的广播,在广播发出之后,所有的广播接收器几乎都会在同一时刻接收到这条广播消息,因为它们之间没有任何先后顺序可言,这种广播的效率会比较高,但同时也意味着它是无法被截断的

如上图所示,每个人都代表一个广播接收器,在广播发出之后,每个人(广播接收器)都会接收到这条广播

有序广播是一种同步执行的广播,在广播发出之后,同一时刻只会有一个广播接收器能够接收到,当这个广播接收器中的逻辑执行完毕之后,广播才会继续传递。所以有序广播是有先后顺序的,优先级高的广播接收器可以先接受到广播消息,并且还可以阻断正在传递的广播,如果截断,后面的接收器就无法收到了

总结一下普通广播和有序广播的特点:

普通广播:

       使用sendBroadcast()发送广播

同级别的广播接收器接收先后顺序是随机的

不同级别的广播接收器,级别低的后收到广播

接收器不能阻断广播,也不能处理广播

同级别的广播接收器,动态注册优先级高于静态注册

有序广播:

       使用sendOrderedBroadcast()发送广播

同级别的广播接收器顺序是随机的(级别越高,越先收到)

能阻断广播,也能处理广播

同级别的广播接收器,动态注册优先级高于静态注册

一个简单的示例演示一下:

看代码

package cn.lixyz.broadcasttest;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText; public class MainActivity extends Activity { private EditText editText; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
} //设置两个按钮的点击事件
public void doClick(View view) {
switch (view.getId()) {
case R.id.button1:
Intent intent = new Intent();
intent.setAction("cn.lixyz.broadcasttest.MainActivity");
sendBroadcast(intent);
break;
case R.id.button2: break;
}
}
}

MainActivity.java

package cn.lixyz.broadcasttest;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log; /**
* Created by LGB on 2015/9/11.
*/
public class MyFirstReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Log.d("TEST","MyFirstReceiver广播接收器接收到了广播");
}
}

MyFirstReceiver.java

package cn.lixyz.broadcasttest;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log; /**
* Created by LGB on 2015/9/11.
*/
public class MySecondReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Log.d("TEST", "MySecondReceiver广播接收器接收到广播了");
}
}

MySecondReceiver.java

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity"> <EditText
android:id="@+id/editText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="输入您要广播的消息" /> <!-- 设置一个发送普通广播的按钮 -->
<Button
android:id="@+id/button1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="30dp"
android:onClick="doClick"
android:text="发送普通广播" /> <!-- 设置一个发送有序广播的按钮 -->
<Button
android:id="@+id/button2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="30dp"
android:onClick="doClick"
android:text="发送有序广播" /> </LinearLayout>

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="cn.lixyz.broadcasttest"> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<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> <receiver android:name=".MyFirstReceiver">
<intent-filter>
<action android:name="cn.lixyz.broadcasttest.MainActivity" /> </intent-filter>
</receiver>
<receiver android:name=".MySecondReceiver">
<intent-filter>
<action android:name="cn.lixyz.broadcasttest.MainActivity" /> </intent-filter>
</receiver>
</application>
</manifest>

AndroidManiFest.xml

运行结果

点击“发送普通广播按钮”,有如下Log:

可以看到两个接收器都已经接收到了广播,这里显示的是MyFirstReceiver先接收到,但其实是随机的。

现在我们修改一下两个接收器的优先级,修改AndroidManiFest.xml文件

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="cn.lixyz.broadcasttest"> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<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> <receiver android:name=".MyFirstReceiver">
<intent-filter android:priority="200">
<action android:name="cn.lixyz.broadcasttest.MainActivity" /> </intent-filter>
</receiver>
<receiver android:name=".MySecondReceiver">
<intent-filter android:priority="300">
<action android:name="cn.lixyz.broadcasttest.MainActivity" /> </intent-filter>
</receiver>
</application>
</manifest>

AndroidManiFest.xml

这时候再看运行结果:

会发现MySecondReceiver首先接收到,所以同级别的广播接收器接收先后顺序是随机的而不同级别的广播接收器,级别低的后收到广播

         我们再尝试阻断一下广播,使用abortBroadcast()方法来阻断广播:

修改MySecondReceiver.java

package cn.lixyz.broadcasttest;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log; /**
* Created by LGB on 2015/9/11.
*/
public class MySecondReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Log.d("TEST", "MySecondReceiver广播接收器接收到广播了");
abortBroadcast();
}
}

MySecondReceiver.java

运行结果:

可见,并没有阻断成功,所以普通广播不能阻断广播

         接下来我们修改一下两个接收器的注册方式:

将MySecondReceiver改为动态注册

package cn.lixyz.broadcasttest;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log; /**
* Created by LGB on 2015/9/11.
*/
public class MySecondReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Log.d("TEST", "MySecondReceiver广播接收器接收到广播了");
abortBroadcast();
}
}

MySecondReceiver.java

package cn.lixyz.broadcasttest;

import android.app.Activity;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText; public class MainActivity extends Activity { private EditText editText;
private IntentFilter intentFilter;
private MySecondReceiver mySecondReceiver; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); intentFilter = new IntentFilter("cn.lixyz.broadcasttest.MainActivity");
mySecondReceiver = new MySecondReceiver();
registerReceiver(mySecondReceiver, intentFilter); } @Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(mySecondReceiver);
} //设置两个按钮的点击事件
public void doClick(View view) {
switch (view.getId()) {
case R.id.button1:
Intent intent = new Intent();
intent.setAction("cn.lixyz.broadcasttest.MainActivity");
intent.putExtra("data", "这是广播信息");
sendBroadcast(intent);
break;
case R.id.button2: break;
}
}
}

MainActivity.java

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="cn.lixyz.broadcasttest"> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<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> <receiver android:name=".MyFirstReceiver">
<intent-filter>
<action android:name="cn.lixyz.broadcasttest.MainActivity" /> </intent-filter>
</receiver>
</application>
</manifest>

AndroidManiFest.xml

运行结果为:

可见:普通广播中同级别的广播接收器,动态注册优先级高于静态注册。

         注意:动态注册的广播接收器,一定要记得取消注册,一般在onDestroy()方法中调用unregisterReceiver(Receiver)来取消注册。

       看一下有序广播,修改代码:

package cn.lixyz.broadcasttest;

import android.app.Activity;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText; public class MainActivity extends Activity { private EditText editText;
private IntentFilter intentFilter;
private MySecondReceiver mySecondReceiver; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
} //设置两个按钮的点击事件
public void doClick(View view) {
switch (view.getId()) {
case R.id.button1:
Intent intent = new Intent();
intent.setAction("cn.lixyz.broadcasttest.MainActivity");
intent.putExtra("data", "这是广播信息");
sendBroadcast(intent);
break;
case R.id.button2:
Intent intent2 = new Intent();
intent2.setAction("cn.lixyz.broadcasttest.MainActivity");
sendOrderedBroadcast(intent2, null);
break;
}
}
}

MainActivity.java

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="cn.lixyz.broadcasttest"> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<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> <receiver android:name=".MyFirstReceiver">
<intent-filter>
<action android:name="cn.lixyz.broadcasttest.MainActivity" />
</intent-filter>
</receiver>
<receiver android:name=".MySecondReceiver">
<intent-filter>
<action android:name="cn.lixyz.broadcasttest.MainActivity" />
</intent-filter>
</receiver>
</application>
</manifest>

AndroidManiFest.xml

将两个广播接收器都设置为静态注册,并且没有设置优先级,默认两个优先级相同,运行结果为:

虽然运行结果是MyFirstReceiver先执行,但实际上有序广播对于优先级相同的接收器也是随机随机的

我们将MySecondReceiver修改为动态注册

package cn.lixyz.broadcasttest;

import android.app.Activity;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText; public class MainActivity extends Activity { private EditText editText;
private IntentFilter intentFilter;
private MySecondReceiver mySecondReceiver; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); mySecondReceiver = new MySecondReceiver();
intentFilter = new IntentFilter("cn.lixyz.broadcasttest.MainActivity");
registerReceiver(mySecondReceiver, intentFilter); } @Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(mySecondReceiver);
} //设置两个按钮的点击事件
public void doClick(View view) {
switch (view.getId()) {
case R.id.button1:
Intent intent = new Intent();
intent.setAction("cn.lixyz.broadcasttest.MainActivity");
intent.putExtra("data", "这是广播信息");
sendBroadcast(intent);
break;
case R.id.button2:
Intent intent2 = new Intent();
intent2.setAction("cn.lixyz.broadcasttest.MainActivity");
sendOrderedBroadcast(intent2, null);
break;
}
}
}

MainActivity.java

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="cn.lixyz.broadcasttest"> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<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> <receiver android:name=".MyFirstReceiver">
<intent-filter>
<action android:name="cn.lixyz.broadcasttest.MainActivity" />
</intent-filter>
</receiver>
</application>
</manifest>

AndroidManiFest.xml

点击“发送有序广播”按钮,运行结果为:

可见,有序广播下,相同优先级的广播接收器,动态注册的要优先于静态注册。

将两个接收器全部设置为静态注册,并设置优先级

package cn.lixyz.broadcasttest;

import android.app.Activity;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText; public class MainActivity extends Activity { private EditText editText;
private IntentFilter intentFilter;
private MySecondReceiver mySecondReceiver; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); } //设置两个按钮的点击事件
public void doClick(View view) {
switch (view.getId()) {
case R.id.button1:
Intent intent = new Intent();
intent.setAction("cn.lixyz.broadcasttest.MainActivity");
intent.putExtra("data", "这是广播信息");
sendBroadcast(intent);
break;
case R.id.button2:
Intent intent2 = new Intent();
intent2.setAction("cn.lixyz.broadcasttest.MainActivity");
sendOrderedBroadcast(intent2, null);
break;
}
}
}

MainActivity.java

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="cn.lixyz.broadcasttest"> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<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> <receiver android:name=".MyFirstReceiver">
<intent-filter android:priority="100">
<action android:name="cn.lixyz.broadcasttest.MainActivity" />
</intent-filter>
</receiver>
<receiver android:name=".MySecondReceiver">
<intent-filter android:priority="200">
<action android:name="cn.lixyz.broadcasttest.MainActivity" />
</intent-filter>
</receiver> <receiver android:name=".MyThirdReceiver">
<intent-filter android:priority="300">
<action android:name="cn.lixyz.broadcasttest.MainActivity" />
</intent-filter> </receiver>
</application>
</manifest>

AndroidManiFest.xml

package cn.lixyz.broadcasttest;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log; /**
* Created by LGB on 2015/9/12.
*/
public class MyThirdReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Log.d("TEST", "MyThirdReceiver广播接收器接收到广播了");
}
}

MyThirdReceiver.java

运行结果

可见,有序广播同样优先级越高,越先接收到消息

         再修改一下MyThirdReceiver.java

package cn.lixyz.broadcasttest;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log; /**
* Created by LGB on 2015/9/12.
*/
public class MyThirdReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Log.d("TEST", "MyThirdReceiver广播接收器接收到广播了");
abortBroadcast();
}
}

MyThirdReceiver.java

点击多次按钮,运行结果为:

可见有序广播是可以阻断广播的

下面演示一下有序广播的值传递

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="cn.lixyz.broadcasttest"> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<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> <receiver android:name=".MyFirstReceiver">
<intent-filter android:priority="300">
<action android:name="cn.lixyz.broadcasttest.MainActivity" />
</intent-filter>
</receiver>
<receiver android:name=".MySecondReceiver">
<intent-filter android:priority="200">
<action android:name="cn.lixyz.broadcasttest.MainActivity" />
</intent-filter>
</receiver> <receiver android:name=".MyThirdReceiver">
<intent-filter android:priority="100">
<action android:name="cn.lixyz.broadcasttest.MainActivity" />
</intent-filter> </receiver>
</application>
</manifest>

AndroidManifest.xml

package cn.lixyz.broadcasttest;

import android.app.Activity;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText; public class MainActivity extends Activity { private EditText editText;
private IntentFilter intentFilter;
private MySecondReceiver mySecondReceiver; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); } //设置两个按钮的点击事件
public void doClick(View view) {
switch (view.getId()) {
case R.id.button1:
Intent intent = new Intent();
intent.setAction("cn.lixyz.broadcasttest.MainActivity");
intent.putExtra("data", "这是广播信息");
sendBroadcast(intent);
break;
case R.id.button2:
Intent intent2 = new Intent();
intent2.setAction("cn.lixyz.broadcasttest.MainActivity");
editText = (EditText) findViewById(R.id.editText);
String str = editText.getText().toString();
intent2.putExtra("data", str);
sendOrderedBroadcast(intent2, null);
break;
}
}
}

MainActivity

package cn.lixyz.broadcasttest;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log; /**
* Created by LGB on 2015/9/11.
*/
public class MyFirstReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Log.d("TEST", "MyFirstReceiver广播接收器接收到了广播,广播内容是:" + intent.getStringExtra("data"));
}
}

MyFirstReceiver.java

package cn.lixyz.broadcasttest;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log; /**
* Created by LGB on 2015/9/11.
*/
public class MySecondReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Log.d("TEST", "MySecondReceiver广播接收器接收到广播了,广播内容是:" + intent.getStringExtra("data"));
String str = "MySecondReceiver新增内容";
Bundle bundle = getResultExtras(true);
bundle.putString("data", intent.getStringExtra("data"));
bundle.putString("data2", str);
setResultExtras(bundle); }
}

MySecondReceiver.java

package cn.lixyz.broadcasttest;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log; /**
* Created by LGB on 2015/9/12.
*/
public class MyThirdReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Bundle bundle = getResultExtras(true);
String data = bundle.getString("data");
String data2 = bundle.getString("data2");
Log.d("TEST", "MyThirdReceiver广播接收器接收到广播了,广播内容是:" + data + data2);
}
}

MyThirdReceiver.java

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity"> <EditText
android:id="@+id/editText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="输入您要广播的消息" /> <!-- 设置一个发送普通广播的按钮 -->
<Button
android:id="@+id/button1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="30dp"
android:onClick="doClick"
android:text="发送普通广播" /> <!-- 设置一个发送有序广播的按钮 -->
<Button
android:id="@+id/button2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="30dp"
android:onClick="doClick"
android:text="发送有序广播" /> </LinearLayout>

activity_main.xml

  运行结果为:




												

Android笔记(二十六) Android中的广播——BroadcastReceiver的更多相关文章

  1. Android笔记二十四.Android基于回调的事件处理机制

        假设说事件监听机制是一种托付式的事件处理,那么回调机制则与之相反,对于基于回调的事件处理模型来说,事件源和事件监听器是统一的,或者说事件监听器全然消失了,当用户在GUI控件上激发某个事件时,控 ...

  2. python3.4学习笔记(二十六) Python 输出json到文件,让json.dumps输出中文 实例代码

    python3.4学习笔记(二十六) Python 输出json到文件,让json.dumps输出中文 实例代码 python的json.dumps方法默认会输出成这种格式"\u535a\u ...

  3. Android之旅十六 android中各种资源的使用

    android中各种资源的使用: 在android开发中,各种资源的合理使用应该在各自的xml中进行定义,以便反复使用; 字符串资源:strings.xml,xml中引用:@string/XXX,ja ...

  4. Android笔记(七十六) 点菜DEMO

    一个朋友让看一下他的代码,一个点菜的功能,他和我一样,初学者,代码比我的都混乱,也是醉了,干脆想着自己写个demo给他看,原本想着听简单,半个小时应该就可以搞定,真正写的时候,画了3h+,汗颜... ...

  5. Android笔记(七十五) Android中的图片压缩

    这几天在做图记的时候遇第一次遇到了OOM,好激动~~ 追究原因,是因为在ListView中加载的图片太大造成的,因为我使用的都是手机相机直接拍摄的照片,图片都比较大,所以在加载的时候会出现内存溢出,那 ...

  6. Android笔记(十) Android中的布局——表格布局

    TableLayout运行我们使用表格的方式来排列控件,它的本质依然是线性布局.表格布局采用行.列的形式来管理控件,TableLayout并不需要明确的声明包含多少行多少列,而是通过添加TableRo ...

  7. Android笔记(十六) 简易计算器

    实现功能: 简单计算器 布局及美化 采用LinearLayout嵌套LinearLayout实现布局. 要求 1. 按钮所有文字居于右下角 2. 按钮为白色,点击变成橘色 3. 显示屏文字居右显示并且 ...

  8. Android核心分析之二十六Android GDI之SurfaceFlinger

    Android GDI之SurfaceFlinger SurfaceFinger按英文翻译过来就是Surface投递者.SufaceFlinger的构成并不是太复杂,复杂的是他的客户端建构.Sufac ...

  9. Android进阶(二十六)MenuInflater实现菜单添加

    MenuInflater实现菜单添加 前言 之前实现的Android项目中可以实现菜单的显示.但是再次调试项目时发现此功能已无法实现,很是令人费解.难道是因为自己手机Android系统的问题?尝试通过 ...

  10. Java学习笔记二十六:Java多态中的引用类型转换

    Java多态中的引用类型转换 引用类型转换: 1.向上类型转换(隐式/自动类型转换),是小类型到大类型的转换: 2.向下类型转换(强制类型转换),是大类型到小类型的转换: 3.instanceof运算 ...

随机推荐

  1. DEBUG技巧1 SE37将参数保存为测试数据

    1. SE37调试函数的时候,将参数保存为测试数据,供下次调试使用, 或者参考标准的赋值进行赋值 2. SE37 ->执行-> 测试序列 测试函数: CO_XT_COMPONENTS_DE ...

  2. LeetCode_283. Move Zeroes

    283. Move Zeroes Easy Given an array nums, write a function to move all 0's to the end of it while m ...

  3. Angular cookies

    参考地址:https://stackoverflow.com/questions/34298133/angular-cookies/36093800#36093800 @Component({ sel ...

  4. php生成0~1随机小数方法

    php生成0~1随机小数方法JavaScript生成0~1随机小数的方法可以调用自带的Math.random(); php生成0~1随机小数方法如下:<pre><?php/** * ...

  5. java后端通过request对象获取请求的ip地址工具类

    package cn.zgjkw.battalion.util; import org.apache.log4j.Logger; import javax.servlet.http.HttpServl ...

  6. SpringCloud服务注册与发现中心-Eureka

    1.服务注册与发现的好处: 假设没有这个东西,那么如果存在a,b,c三个同样的服务: 而现在有一个u服务需要用到a或b或c提供的接口,那么u里面肯定是需要配置这三个服务的地址,然后调用的时候还有问题就 ...

  7. Word表格和文本自由互换

    未完 ...... 点击访问原文(进入后根据右侧标签,快速定位到本文)

  8. Python--递归函数实现:多维嵌套字典数据无限遍历

    原创:多层嵌套字典无限遍历,实现当value值以特殊字符$开头,并且等于某项值时,用随机函数替换该参数 """处理前的字典{'patient': {'avatarPic' ...

  9. PAT(B) 1083 是否存在相等的差(Java)统计

    题目链接:1083 是否存在相等的差 (20 point(s)) 题目描述 给定 N 张卡片,正面分别写上 1.2.--.N,然后全部翻面,洗牌,在背面分别写上 1.2.--.N.将每张牌的正反两面数 ...

  10. Spring Boot的配置文件-yml文件的集合配置方式

    yml集合数据的表示方式: 这种方式是配置普通的字符串—— 如果集合中装的是对象,就这么配置—— 行内配置方式—— map的配置方式——