Android - Intent使我的应用程序崩溃

时间:2015-02-04 16:03:11

标签: android android-intent

我正在Android上创建一个应用程序,它涉及一个Activity和一个服务。该服务的一个组件是向MainActivity发送信号,MainActivity将执行一些特定的代码。问题是,尝试发送意图会导致应用程序崩溃。

以下是发送意图的代码。请注意,它位于doInBackground对象的AsyncTask函数内部,该函数驻留在所述服务中:

    @Override
    protected String doInBackground(Socket... client) {
        Intent received = new Intent();
        received.setAction("com.mycompany.Messenger.MESSAGE_RECEIVED");
        sendBroadcast(received);

    }

请注意,如果我发表评论sendBroadcast(received),该应用程序不会崩溃。

以下是MainActivity中Intent的处理程序(我的应用程序中名称为ChatBubbleActivity):

  public class MessageReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        if(intent.getAction().equals(MESSAGE_RECEIVED)) {
            String current_message = "Intent works!";
            TextView textView = (TextView) findViewById(R.id.myText);
            textView.setText(current_message);
        }
    }
}

这是清单中Receiver的声明:

  <receiver android:name=".ChatBubbleActivity$MessageReceiver">
            <intent-filter>
                <action android:name="com.mycompany.Messenger.MESSAGE_RECEIVED"/>
            </intent-filter>

 </receiver>

,在<activity>块内。 我可能会失踪的是什么?

编辑:基于答案的新版代码仍在崩溃。 编辑logcat:

02-04 16:17:32.444      487-489/? D/dalvikvm﹕ GC_CONCURRENT freed 1662K, 22% free 6885K/8728K, paused 2ms+2ms, total 42ms
02-04 16:17:32.876    1275-1275/? D/AndroidRuntime﹕ >>>>>> AndroidRuntime START com.android.internal.os.RuntimeInit <<<<<<
02-04 16:17:32.912    1275-1275/? D/AndroidRuntime﹕ CheckJNI is OFF
02-04 16:17:32.960    1275-1275/? D/dalvikvm﹕ Trying to load lib libjavacore.so 0x0
02-04 16:17:32.964    1275-1275/? D/dalvikvm﹕ Added shared lib libjavacore.so 0x0
02-04 16:17:32.968    1275-1275/? D/dalvikvm﹕ Trying to load lib libnativehelper.so 0x0
02-04 16:17:32.972    1275-1275/? D/dalvikvm﹕ Added shared lib libnativehelper.so 0x0
02-04 16:17:32.972    1275-1275/? D/dalvikvm﹕ No JNI_OnLoad found in libnativehelper.so 0x0, skipping init
02-04 16:17:33.020    1275-1275/? D/dalvikvm﹕ Note: class Landroid/app/ActivityManagerNative; has 179 unimplemented (abstract) methods
02-04 16:17:33.128    1275-1275/? E/memtrack﹕ Couldn't load memtrack module (No such file or directory)
02-04 16:17:33.132    1275-1275/? E/android.os.Debug﹕ failed to load memtrack module: -2
02-04 16:17:33.264    1275-1275/? D/AndroidRuntime﹕ Calling main entry com.android.commands.am.Am
02-04 16:17:33.284      487-617/? I/ActivityManager﹕ START u0 {act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10000000 cmp=com.mycompany.messenger/com.mycompany.Messenger.ChatBubbleActivity} from pid 1275
02-04 16:17:33.692    1275-1275/? D/AndroidRuntime﹕ Shutting down VM
02-04 16:17:33.692    1275-1279/? D/dalvikvm﹕ GC_CONCURRENT freed 95K, 15% free 576K/676K, paused 1ms+0ms, total 1ms
02-04 16:17:33.884      487-538/? I/ActivityManager﹕ Start proc com.mycompany.messenger for activity com.mycompany.messenger/com.mycompany.Messenger.ChatBubbleActivity: pid=1286 uid=10059 gids={50059, 3003}
02-04 16:17:33.932    1286-1286/? D/dalvikvm﹕ Late-enabling CheckJNI
02-04 16:17:34.228    1286-1286/? D/dalvikvm﹕ GC_FOR_ALLOC freed 60K, 4% free 2873K/2992K, paused 6ms, total 7ms
02-04 16:17:34.236    1286-1286/? I/dalvikvm-heap﹕ Grow heap (frag case) to 3.338MB for 500412-byte allocation
02-04 16:17:34.248    1286-1295/? D/dalvikvm﹕ GC_FOR_ALLOC freed <1K, 4% free 3362K/3484K, paused 11ms, total 11ms
02-04 16:17:34.252    1286-1290/? D/dalvikvm﹕ GC_CONCURRENT freed 0K, 4% free 3362K/3484K, paused 1ms+0ms, total 5ms
02-04 16:17:34.696    1286-1286/? D/libEGL﹕ loaded /system/lib/egl/libEGL_genymotion.so
02-04 16:17:34.708    1286-1286/? D/﹕ HostConnection::get() New Host Connection established 0xb7944cb0, tid 1286
02-04 16:17:34.744    1286-1286/? D/libEGL﹕ loaded /system/lib/egl/libGLESv1_CM_genymotion.so
02-04 16:17:34.744    1286-1286/? D/libEGL﹕ loaded /system/lib/egl/libGLESv2_genymotion.so
02-04 16:17:34.816    1286-1286/? W/EGL_genymotion﹕ eglSurfaceAttrib not implemented
02-04 16:17:34.820    1286-1286/? E/OpenGLRenderer﹕ Getting MAX_TEXTURE_SIZE from GradienCache
02-04 16:17:34.824    1286-1286/? E/OpenGLRenderer﹕ MAX_TEXTURE_SIZE: 8192
02-04 16:17:34.848    1286-1286/? E/OpenGLRenderer﹕ Getting MAX_TEXTURE_SIZE from Caches::initConstraints()
02-04 16:17:34.848    1286-1286/? E/OpenGLRenderer﹕ MAX_TEXTURE_SIZE: 8192
02-04 16:17:34.852    1286-1286/? D/OpenGLRenderer﹕ Enabling debug mode 0
02-04 16:17:34.932    1286-1300/? W/dalvikvm﹕ threadid=12: thread exiting with uncaught exception (group=0xa4d31b20)
02-04 16:17:34.932    1286-1300/? E/AndroidRuntime﹕ FATAL EXCEPTION: AsyncTask #2
    Process: com.mycompany.messenger, PID: 1286
    java.lang.RuntimeException: An error occured while executing doInBackground()
            at android.os.AsyncTask$3.done(AsyncTask.java:300)
            at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
            at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
            at java.util.concurrent.FutureTask.run(FutureTask.java:242)
            at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
            at java.lang.Thread.run(Thread.java:841)
     Caused by: android.util.AndroidRuntimeException: Calling startActivity() from outside of an Activity  context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?
            at android.app.ContextImpl.startActivity(ContextImpl.java:1050)
            at android.app.ContextImpl.startActivity(ContextImpl.java:1037)
            at android.content.ContextWrapper.startActivity(ContextWrapper.java:311)
            at com.mycompany.Messenger.LocalService$DownloadWebpageTask2.doInBackground(LocalService.java:118)
            at com.mycompany.Messenger.LocalService$DownloadWebpageTask2.doInBackground(LocalService.java:113)
            at android.os.AsyncTask$2.call(AsyncTask.java:288)
            at java.util.concurrent.FutureTask.run(FutureTask.java:237)
            at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
            at java.lang.Thread.run(Thread.java:841)
02-04 16:17:34.936      487-617/? W/ActivityManager﹕ Force finishing activity com.mycompany.messenger/com.mycompany.Messenger.ChatBubbleActivity
02-04 16:17:35.180      487-840/? W/InputMethodManagerService﹕ Focus gain on non-focused client com.android.internal.view.IInputMethodClient$Stub$Proxy@529ef2ac (uid=10059 pid=1286)
02-04 16:17:35.288      487-617/? I/WindowManager﹕ Screenshot max retries 4 of Token{52998cec ActivityRecord{5294f214 u0 com.mycompany.messenger/com.mycompany.Messenger.ChatBubbleActivity t4 f}} appWin=Window{52948c58 u0 Starting com.mycompany.messenger} drawState=4
02-04 16:17:35.288      487-617/? W/WindowManager﹕ Screenshot failure taking screenshot for (800x1280) to layer 21015
02-04 16:17:38.512      487-502/? I/Choreographer﹕ Skipped 188 frames!  The application may be doing too much work on its main thread.
02-04 16:17:38.516      711-711/? I/Choreographer﹕ Skipped 185 frames!  The application may be doing too much work on its main thread.
02-04 16:17:39.708      117-117/? D/local_opengl﹕ Select interrupted or nothing to read
02-04 16:17:40.536      711-711/? W/EGL_genymotion﹕ eglSurfaceAttrib not implemented
02-04 16:17:41.260      487-502/? I/Choreographer﹕ Skipped 35 frames!  The application may be doing too much work on its main thread.
02-04 16:17:49.560    1286-1300/? I/Process﹕ Sending signal. PID: 1286 SIG: 9
02-04 16:17:49.580      487-616/? W/InputMethodManagerService﹕ Window already focused, ignoring focus gain of: com.android.internal.view.IInputMethodClient$Stub$Proxy@52963b68 attribute=null, token = android.os.BinderProxy@5290713c
02-04 16:17:49.644      487-840/? I/ActivityManager﹕ Process com.mycompany.messenger (pid 1286) has died.
02-04 16:17:49.716      117-117/? D/local_opengl﹕ Select interrupted or nothing to read
02-04 16:17:59.720      117-117/? D/local_opengl﹕ Select interrupted or nothing to read
02-04 16:18:09.728      117-117/? D/local_opengl﹕ Select interrupted or nothing to read
02-04 16:18:19.736      117-117/? D/local_opengl﹕ Select interrupted or nothing to read
02-04 16:18:29.744      117-117/? D/local_opengl﹕ Select interrupted or nothing to read
02-04 16:18:39.752      117-117/? D/local_opengl﹕ Select interrupted or nothing to read
02-04 16:18:49.756      117-117/? D/local_opengl﹕ Select interrupted or nothing to read
02-04 16:18:59.764      117-117/? D/local_opengl﹕ Select interrupted or nothing to read
02-04 16:19:09.772      117-117/? D/local_opengl﹕ Select interrupted or nothing to read
02-04 16:19:19.780      117-117/? D/local_opengl﹕ Select interrupted or nothing to read
02-04 16:19:29.788      117-117/? D/local_opengl﹕ Select interrupted or nothing to read
02-04 16:19:39.792      117-117/? D/local_opengl﹕ Select interrupted or nothing to read
02-04 16:19:49.800      117-117/? D/local_opengl﹕ Select interrupted or nothing to read

2 个答案:

答案 0 :(得分:0)

您想开始活动还是发送广播?我不明白你的代码。

您正在从后台线程开始活动,这是不允许的。

AsyncTask中,受保护的String doInBackground(Socket... client)方法是唯一一个未在UI线程中运行的方法。

答案 1 :(得分:0)

当你想要开始Broadcast Receiver时,你不要把它称为活动

你的方法

Intent received = new Intent(ChatBubbleActivity.MESSAGE_RECEIVED);
received.putExtra("current", "Intent is working!!");
startActivity(received);

应该是什么

Intent intent = new Intent();
intent.setAction("com.tutorialspoint.CUSTOM_INTENT");
sendBroadcast(intent);

看一下这些教程