内部类广播需要public和static

采用广播接收者(BroadcastReceiver)使service与activity进行通信。在该例子中我们在service子类中定义了一个自定义的广播接收者,该广播接收者监听activity发出的特定的广播,并从而触发onReceive方法,我们在此方法中间接调用service类的方法,从而实现了service与activity间的通信。例子中的广播接收者是采用动态的方式注册的(即使用registerReceiver和unregisterReceiver方法),但是我们知道,广播接收者还有一种静态的方式注册,即在清单文件中配置receiver节点(之所以没采用静态注册是因为这种方式有一些需要注意的地方)。
那么下面我们就采用静态方式注册一个作为内部类的广播接收者。

1.activity定义(布局很简单,就一个button,不贴代码了)

package com.example.brocastdemo;

import android.app.Activity;

import android.content.BroadcastReceiver;

import android.content.Context;

import android.content.Intent;

import android.os.Bundle;

import android.util.Log;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.Button;

public class MainActivity extends Activity

{

private Button but = null;

@Override

protected void onCreate(Bundle savedInstanceState)

{

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

but = (Button) findViewById(R.id.but);

but.setOnClickListener(new OnClickListener()

{

@Override

public void onClick(View v)

{

Intent intent = new Intent("com.aaa");

MainActivity.this.sendBroadcast(intent);

}

});

}

public static class MyReceiver extends BroadcastReceiver//作为内部类的广播接收者

{

@Override

public void onReceive(Context context, Intent intent)

{

if (intent.getAction().equals("com.aaa"))

{

Log.i("MainActivity","成功收到广播");

}

}

}

}

2.清单文件:

<receiver

android:name="com.example.brocastdemo.MainActivity$MyReceiver"

>

<intent-filter >

<action android:name="com.aaa"/>

</intent-filter>

</receiver>

下面总结一下作为内部类的广播接收者在注册的时候需要注意的地方:
1.清单文件注册广播接收者时,广播接收者的名字格式需要注意。因为是内部类,所以需要在内部类所在的类与内部类之间加上$符号:

android:name="com.example.brocastdemo.MainActivity$MyReceiver"

2.内部类在声明时一定要写成静态内部类(class关键字前加上static)及public。否则会抛出类似这样的异常:动态则不要

02-19 09:11:14.650: E/AndroidRuntime(1771): java.lang.RuntimeException: Unable to instantiate receiver com.example.brocastdemo.MainActivity$MyReceiver: java.lang.InstantiationException: can‘t instantiate class com.example.brocastdemo.MainActivity$MyReceiver; no empty constructor

大家可能会发现,采用静态注册的作为内部类的广播接收者使用起来很不方便,因为是静态内部类,所以该类中如果想使用外部类的变量/方法,该变量/方法也得是静态的。
所以还是强烈推荐大家使用动态方式注册,下面将例子改为动态方式注册。
修改后的activity:

package com.example.brocastdemo;

import android.app.Activity;

import android.content.BroadcastReceiver;

import android.content.Context;

import android.content.Intent;

import android.content.IntentFilter;

import android.os.Bundle;

import android.util.Log;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.Button;

//采用动态方式注册一个作为内部类的广播接收者

public class MainActivity extends Activity

{

private Button but = null;

private MyReceiver receiver = null;

@Override

protected void onCreate(Bundle savedInstanceState)

{

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

but = (Button) findViewById(R.id.but);

/*动态方式注册广播接收者*/

receiver = new MyReceiver();

IntentFilter filter = new IntentFilter();

filter.addAction("com.aaa");

this.registerReceiver(receiver, filter);

but.setOnClickListener(new OnClickListener()

{

@Override

public void onClick(View v)

{

Intent intent = new Intent("com.aaa");

MainActivity.this.sendBroadcast(intent);

}

});

}

public class MyReceiver extends BroadcastReceiver

{

@Override

public void onReceive(Context context, Intent intent)

{

if (intent.getAction().equals("com.aaa"))

{

Log.i("MainActivity","成功收到广播");

}

}

}

@Override

protected void onDestroy()

{

if(receiver!=null)

this.unregisterReceiver(receiver);

}

}

此时,清单文件中不用加receiver节点了。测试当然也是通过的,这样做就方便多了!

时间: 2024-08-05 14:24:25

内部类广播需要public和static的相关文章

oop_day05_package、public、static、final、内部类

--20150813 1.方法的重写: 1)父子类中,方法签名相同,方法体不同 2)重写方法被调用时,看对象的类型 3)遵循"两同两小一大"规则: 3.1)两同: 方法名相同,参数列表相同 3.2)两小: 子类的返回值类型小于或等于父类-----一般都是等于 3.2.1)返回类型为void时,必须相同               3.2.2)返回类型为基本类型时,必须相同               3.2.3)返回类型为引用类型时,需小于或等于 子类抛出的异常小于或等于父类 3.3)

java修饰符public final static abstract transient

JAVA 修饰符public final static abstract transient 关键字: public final static abstract ... 1.public protected default private 组 位置                        private      默认      protected        public 同一个类                    是            是         是         

JavaScript实现类的private、protected、public、static以及继承

基础知识 JavaScript中的类 JavaScript实际上是一种弱类型语言,与C++和Java等语言不同.因此,在JavaScript中,没有强调类(class)这一概念,但实际运用中,类还是很重要的,比如写一款游戏,如果我们不停地调用函数来完成创建角色,移动角色的话,那会是什么样的呢?可能会出现非常多的重复代码,因此我们需要一个类来统一这些代码.所谓的类,就是把程序中的代码分类,比如说游戏中的关于角色的代码算作一类,游戏背景算作一类,游戏特效又是一类.这样一来,我们对类进行操作,就不会使

Java中private、public、static、protetced、abstract、final

abstract (抽象的) 1.abstract可以修饰类和成员方法,被abstract修饰的类称为抽象类,被abstract修饰成员方法叫抽象方法.抽象类不一定有抽象方法,但拥有抽象方法的一定是抽象类; 2.被abstract修饰的类不能直接实例化,需要通过子类实现,所有抽象类一定有子类. 3.继承抽象类的子类必须重写抽象类中的被abstract修饰的抽象方法,如果不继承就必须把自己变成抽象的子类. final (最终的) final可以修饰类,成员变量,成员方法,局部变量/形参. 2.fi

ty修饰符 public private static

修饰符 public private 当一个类的成员变量没有修饰的时候 ,外界是可以进行访问的, 默认的就是 public 进行修饰. private 属性只能够 在父类的内部直接 进行访问(); class Person{ age:10 private name = "张三" // private 属性只能够 在类的内部 进行访问; say() { console.log("我的名字是"+this.name) } } class Person { age: 10;

android Broadcast广播消息代码实现

我用的是Fragment , 发送写在一个类中,接收写在另外一个类的内部类中.代码动态实现注册. 代码: myReceiver = new zcd.netanything.MyCar.myReceiver(); IntentFilter filter = new IntentFilter(); //向过滤器中添加action filter.addAction("zcd.netanything"); //注册广播 getActivity().registerReceiver(myRece

Service 广播 到Fragment

//Fragment public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); System.out.println("oncreate"); //代码 注册 广播接收器 Receiver=new myReceiver(); IntentFilter filter=new IntentFilter(); filter.addAction("zcd.voicerob

Java 内部类详解

内部类顾名思义:就是类中还有类,Java内部类的出现解决了类中被private修饰的变量或引用可以被直接访问到. 成员内部类: 先看一下内部类的写法. public class Outer { private int x=9; class Inner{//内部类 void fun(){ System.out.println("Inner:"+x); } } } 因为该内部类和成员变量是同级别的,所以叫成员内部类,既然是成员内部类,那成员变量的修饰符完全适用于内部类中.下面看一下内部类实

Java编程思想读书笔记

声明:原创作品,转载时请注明文章来自SAP师太技术博客:www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将追究法律责任!原文链接:http://www.cnblogs.com/jiangzhengjun/p/4290955.html 第一章对象导论... 1 第二章一切都是对象... 4 第三章操作符... 10 第四章流程控制... 12 第五章初始化与清理... 14 第六章访问权限控制... 15 第七章复用... 23 第八章多态... 2