can't instantiate class com.example.xxx.xx.MainActivity$MyReceiver不能初始化内部类

qiang_xi 2015-09-06 02:53:57
问题困扰我很久了,从国内国外网站均没有找到有效的解决办法,不知道大神们都怎么解决的,特来问一下,希望不吝赐教.
先说一下我要实现的功能:就是获取从bmob的服务器推送过来的消息,用BroadcastReceiver接收,接收到之后再发送一个广播给主界面的broadcastReceiver接收,获取到推送过来的数据之后显示到textView上.就这么简单,但是运行的时候老是报不能初始化类的异常,从各种渠道查找解决办法也没找到,不知道该怎么解决,请这里的大神给个有效的建议或者说,有更好的方式实现这个功能,下面是我的代码:

package com.example.administrator.bmob;

import android.app.Notification;
import android.app.NotificationManager;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;

import cn.bmob.push.PushConstants;

public class Receiver extends BroadcastReceiver {
private NotificationManager manager;
private String STATIC_NORMAL_ACTION = "com.example.administrator.bmob.TEST";

@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(PushConstants.ACTION_MESSAGE)) {
Log.d("bmob", "客户端收到推送内容:" + intent.getStringExtra(PushConstants.EXTRA_PUSH_MESSAGE_STRING));
String msg = intent.getStringExtra(PushConstants.EXTRA_PUSH_MESSAGE_STRING);

manager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
Notification.Builder builder = new Notification.Builder(context);
builder.setContentText(msg)
.setDefaults(Notification.DEFAULT_LIGHTS | Notification.DEFAULT_SOUND)
.setTicker("懒人账本提醒...")
.setAutoCancel(true)
.setSmallIcon(R.mipmap.ic_launcher);
Notification notification = builder.build();
manager.notify(1, notification);
Intent data = new Intent(STATIC_NORMAL_ACTION);
Bundle bundle = new Bundle();
bundle.putString("data", msg);
data.putExtras(bundle);
context.sendOrderedBroadcast(data, null);
}
}
}

主界面代码:
package com.example.administrator.bmob;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.TextView;

import cn.bmob.push.BmobPush;
import cn.bmob.v3.Bmob;
import cn.bmob.v3.BmobInstallation;

public class MainActivity extends AppCompatActivity {
private TextView textView;
private String STATIC_NORMAL_ACTION = "com.example.administrator.bmob.TEST";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = (TextView) findViewById(R.id.textView);
// 初始化BmobSDK
Bmob.initialize(this, "336be8699869f10b984f71c0c3cdb91a");
// 使用推送服务时的初始化操作
BmobInstallation.getCurrentInstallation(this).save();
// 启动推送服务
BmobPush.startWork(this, "336be8699869f10b984f71c0c3cdb91a");

/* IntentFilter filter = new IntentFilter(STATIC_NORMAL_ACTION);
MyReceiver receiver = new MyReceiver();
registerReceiver(receiver, filter);*/
}
public class MyReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(STATIC_NORMAL_ACTION)) {
Bundle bundle = getResultExtras(true);
String data = bundle.getString("data");
textView.setText(data);
}
}
}
}

这是报出来的异常:
 Caused by: java.lang.InstantiationException: can't instantiate class com.example.administrator.bmob.MainActivity$MyReceiver; no empty constructor

...全文
437 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
qiang_xi 2015-09-06
  • 打赏
  • 举报
回复
这个问题已经自己解决了,这里要采用动态注册广播接收者,并且要把注册代码放到activity的onStart()方法里,这样就能接收到了下面是代码:
package com.example.administrator.bmob;

import android.app.Notification;
import android.app.NotificationManager;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;

import cn.bmob.push.PushConstants;

public class Receiver extends BroadcastReceiver {
    private NotificationManager manager;
    private String STATIC_NORMAL_ACTION = "com.example.administrator.bmob.TEST";

    @Override
    public void onReceive(Context context, Intent intent) {
        if (intent.getAction().equals(PushConstants.ACTION_MESSAGE)) {
            Log.e("bmob", "客户端收到推送内容:" + intent.getStringExtra(PushConstants.EXTRA_PUSH_MESSAGE_STRING));
            String msg = intent.getStringExtra(PushConstants.EXTRA_PUSH_MESSAGE_STRING);

            manager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
            Notification.Builder builder = new Notification.Builder(context);
            builder.setContentText(msg)
                    .setDefaults(Notification.DEFAULT_LIGHTS | Notification.DEFAULT_SOUND)
                    .setTicker("懒人账本提醒...")
                    .setAutoCancel(true)
                    .setSmallIcon(R.mipmap.ic_launcher);
            Notification notification = builder.build();
            manager.notify(1, notification);

            Intent data = new Intent(STATIC_NORMAL_ACTION);
            Bundle bundle = new Bundle();
            bundle.putString("data", msg);
            data.putExtras(bundle);
            context.sendOrderedBroadcast(data, null);
            Log.e("data=",data.toString());
            Log.e("tag", "3");
        }
    }
}
主界面代码:
package com.example.administrator.bmob;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.widget.TextView;
import android.widget.Toast;

import cn.bmob.push.BmobPush;
import cn.bmob.v3.Bmob;
import cn.bmob.v3.BmobInstallation;

public class MainActivity extends AppCompatActivity {
    private TextView textView;
    private String STATIC_NORMAL_ACTION = "com.example.administrator.bmob.TEST";
    private BroadcastReceiver receiver;

    /**
     * 动态注册时,broadcastReceiver最好注册在onStart()方法中,这样只要程序不被关闭,都能收到广播
     * 最好不要注册在onCreate(Bundle savedInstanceState)方法里,因为在这个方法里注册后,立刻就失效了
     */
    @Override
    protected void onStart() {
        super.onStart();
        IntentFilter filter = new IntentFilter(STATIC_NORMAL_ACTION);
        registerReceiver(receiver, filter);
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        textView = (TextView) findViewById(R.id.textView);
        // 初始化BmobSDK
        Bmob.initialize(this, "336be8699869f10b984f71c0c3cdb91a");
        // 使用推送服务时的初始化操作
        BmobInstallation.getCurrentInstallation(this).save();
        // 启动推送服务
        BmobPush.startWork(this, "336be8699869f10b984f71c0c3cdb91a");

        receiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                if (intent.getAction().equals(STATIC_NORMAL_ACTION)) {
                    Bundle bundle = intent.getExtras();
                    String data = bundle.getString("data");
                    Toast.makeText(context,data,Toast.LENGTH_SHORT).show();
                    textView.setText(data);
                    Log.e("tag", "1");
                }
            }
        };
    }
}
qiang_xi 2015-09-06
  • 打赏
  • 举报
回复
再补充一句,我的两个broadcastReceiver都采用静态方式注册好了

80,351

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧