2012-01-07 25 views
28

Ngày tốt, tôi đang cố gắng hiển thị hộp thoại cảnh báo sau khi khởi động lại hệ thống trong bộ thu phát sóng. Tôi đã thêm người nhận vào tệp kê khai của mình và gọi là quyền cần thiết, nhưng tôi gặp lỗi khi hiển thị hộp thoại. Hãy Làm thế nào tôi có thể thực hiện điều này một cách chính xác .. Cảm ơn bạnhiển thị hộp thoại cảnh báo trong bộ thu phát sau khi khởi động lại hệ thống

mã của tôi:

public void onReceive(final Context context, Intent intent) { 
    Log.d(TAG, "received boot completed broadcast receiver... starting settings"); 


    String settings = context.getResources().getString(R.string.restart_setting); 
     String yes = context.getResources().getString(R.string.Settings); 
     String no = context.getResources().getString(R.string.Cancel); 

       final AlertDialog.Builder builder = new AlertDialog.Builder(context); 
       builder.setMessage(settings) 
         .setCancelable(false) 
         .setPositiveButton(yes, new DialogInterface.OnClickListener() { 
    public void onClick(@SuppressWarnings("unused") final DialogInterface dialog, @SuppressWarnings("unused") final int id) 
    Intent config = new Intent(context, WeatherConfigure.class) 
    context.startActivity(config); 

    } 
}) 
    .setNegativeButton(no, new DialogInterface.OnClickListener() { 
     public void onClick(final DialogInterface dialog, @SuppressWarnings("unused") final int id) { 
      dialog.cancel(); 
     } 
    }); 
    final AlertDialog alert = builder.create(); 
    alert.show(); 

    } 

đang nhận được lỗi đăng nhập này:

01-07 01:42:01.559: ERROR/AndroidRuntime(2004): Caused by: android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application 

01-07 01:42:01.559: ERROR/AndroidRuntime(2004): at android.view.ViewRoot.setView(ViewRoot.java:548) 

01-07 01:42:01.559: ERROR/AndroidRuntime(2004):at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:177) 

01-07 01:42:01.559: ERROR/AndroidRuntime(2004): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91) 

01-07 01:42:01.559: ERROR/AndroidRuntime(2004):at android.app.Dialog.show(Dialog.java:288) 

01-07 01:42:01.559: ERROR/AndroidRuntime(2004):at com.MuaaApps.MyWeatherUpdate.myWeatherBroadcastReceiver.onReceive(MyWeatherBroadcastReceiver.java:59) 

01-07 01:42:01.559: ERROR/AndroidRuntime(2004): at android.app.ActivityThread.handleReceiver(ActivityThread.java:1994) 
+0

Một thông báo Bánh mì nướng hoặc Thông báo có thể phù hợp hơn trong trường hợp này, thay vì làm nổ người dùng bằng hộp thoại cảnh báo khi điện thoại của họ bật. – cottonBallPaws

+0

@littleFluffyKitty, vâng tôi hiểu ý bạn là gì. Tôi chỉ thử các kịch bản khác nhau để xem tôi nghĩ gì sẽ mang lại trải nghiệm người dùng tốt, nhưng tôi phải thừa nhận đề xuất thông báo bạn đã thực hiện là một lựa chọn rất hấp dẫn. không nghĩ về điều đó. Cảm ơn – irobotxxx

Trả lời

38

Vấn đề là bạn đang cố gắng để hiển thị một AlertDialog từ a BroadcastReceiver, không được phép. Bạn không thể hiển thị số AlertDialog từ số BroadcastReceiver. Chỉ các hoạt động mới có thể hiển thị hộp thoại.

Bạn nên làm điều gì đó khác, hãy bắt đầu khởi động BroadcastReceiver khi khởi động và bắt đầu một hoạt động để hiển thị hộp thoại.

Dưới đây là một số blog post thêm về điều này.

CHỈNH SỬA:

Đây là cách tôi khuyên bạn nên thực hiện. Từ bạn BroadcastReceiver bắt đầu một Activity với một AlertDialog như vậy ..

public class NotifySMSReceived extends Activity 
{ 
    private static final String LOG_TAG = "SMSReceiver"; 
    public static final int NOTIFICATION_ID_RECEIVED = 0x1221; 
    static final String ACTION = "android.provider.Telephony.SMS_RECEIVED"; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     IntentFilter filter = new IntentFilter(ACTION); 
     this.registerReceiver(mReceivedSMSReceiver, filter); 
    } 

    private void displayAlert() 
    { 
     AlertDialog.Builder builder = new AlertDialog.Builder(this); 
     builder.setMessage("Are you sure you want to exit?").setCancelable(
      false).setPositiveButton("Yes", 
      new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int id) { 
        dialog.cancel(); 
       } 
      }).setNegativeButton("No", 
      new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int id) { 
        dialog.cancel(); 
       } 
      }); 
     AlertDialog alert = builder.create(); 
     alert.show(); 
    } 

    private final BroadcastReceiver mReceivedSMSReceiver = new BroadcastReceiver() { 

     @Override 
     public void onReceive(Context context, Intent intent) { 
      String action = intent.getAction(); 

      if (ACTION.equals(action)) 
      { 
       //your SMS processing code 
       displayAlert(); 
      } 
     } 
    } 
} 

Như bạn thấy ở đây tôi không bao giờ gọi setContentView(). Điều này là do hoạt động sẽ có chế độ xem trong suốt và chỉ hộp thoại cảnh báo mới hiển thị.

+0

Ok. Cám ơn giải thích rõ ràng. điều đó có nghĩa là không thể tạo một hộp thoại cảnh báo từ một máy thu phát sóng hay chỉ trong loại phát sóng cụ thể này? – irobotxxx

+0

Xem bản chỉnh sửa của tôi. –

+0

Cảm ơn bạn đã dành thời gian. sau đó sử dụng thông báo – irobotxxx

7

Đây là post về cách thực hiện. Bạn có thể lấy mã nguồn từ here.

Bạn không thể hiển thị hộp thoại trực tiếp từ bộ thu phát sóng của mình. Bạn phải sử dụng Activity. Ngoài ra, để nhận được ACTION_BOOT_COMPLETED hoạt động của bạn phải được người dùng hoặc ứng dụng khác bắt đầu một cách rõ ràng trước tiên (ứng dụng google đã dừng trạng thái để biết thêm thông tin).

Về cơ bản, để đạt được các chức năng cần thiết, bạn cần thực hiện:

  1. Tạo hoạt động minh bạch cho thấy hộp thoại.
  2. Tạo BroadcastReceiver nhận ACTION_BOOT_COMPLETED và bắt đầu hoạt động của bạn.
  3. Đăng ký bộ thu phát sóng của bạn trong tệp kê khai và nhận được sự cho phép thích hợp.

Ngoài ra, this câu hỏi cung cấp thêm thông tin về cách tạo hoạt động trong suốt.

+0

của nó một bài viết tuyệt vời. Cảm ơn nhưng tôi muốn hiển thị hộp thoại sau khi kích hoạt nhận từ dấu nhắc lệnh. Làm thế nào để đạt được điều đó, ở đây hộp thoại hiển thị lúc đầu. – AndroidOptimist

+0

Như tôi đã hiểu, mục tiêu của bạn vẫn là hiển thị hộp thoại từ 'BroadcastReceiver'. Sự khác biệt duy nhất là người nhận của bạn được kích hoạt bởi một ý định khác (không phải 'android.intent.action.BOOT_COMPLETED'), phải không? –

+0

Có bạn đã đúng. Tôi đã sửa lỗi của mình :-) – AndroidOptimist

26

Bạn không thể sử dụng hộp thoại trên BroadcastReceiver, nên thay vì bạn gọi tốt hơn một hoạt động cho hộp thoại từ BroadcastReceiver,

thêm mã này trong chức năng onReceive của bạn:

@Override 
public void onReceive(Context context, Intent intent) 
{ 
    Intent i = new Intent(context, {CLASSNAME}.class); 
    i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
    context.startActivity(i); 
} 

lấp đầy {CLASSNAME} có hoạt động hộp thoại, hoạt động hộp thoại của tôi hoạt động:

package com.example.mbanking; 

import android.os.Bundle; 
import android.app.Activity; 
import android.app.AlertDialog; 
import android.content.DialogInterface; 


// ALERT DIALOG 
// Sources : http://techblogon.com/alert-dialog-with-edittext-in-android-example-with-source-code/ 

public class AlertDialogActivity extends Activity 
{ 

@Override 
protected void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 

    AlertDialog.Builder builder = new AlertDialog.Builder(this); 
    builder 
     .setTitle("Test") 
     .setMessage("Are you sure you want to exit?") 
     .setCancelable(false) 
     .setPositiveButton("Yes", new DialogInterface.OnClickListener() 
     { 
      public void onClick(DialogInterface dialog, int id) 
      { 
       dialog.cancel(); 
      } 
     }) 
     .setNegativeButton("No", new DialogInterface.OnClickListener() 
     { 
      public void onClick(DialogInterface dialog, int id) 
      { 
       dialog.cancel(); 
      } 
     }); 
    AlertDialog alert = builder.create(); 
    alert.show(); 
} 
} 

nơi tôi nhận được câu trả lời?, Tại đây: How do you use an alert dialog box in a broadcast receiver in android? nhờ Femi !!, tôi chỉ truyền bá tin tức: D

+0

tôi đã thử nhưng nó không làm việc cho tôi –

0

Đây có thể là chuỗi cũ và được trả lời, nhưng câu trả lời được trả lời không hữu ích chút nào.

You cannot launch a popup dialog in your implementation of onReceive(). BroadcastReceiver

Thay vì hộp thoại hoặc popupWindow, bạn có thể sử dụng một hoạt động được theo chủ đề như thoại

<activity 
    android:taskAffinity="" 
    android:name=".activity.CallActivity" 
    android:label="@string/app_name" 
    android:theme="@style/AppTheme.Dialog" /> 

Xin lưu ý rằng tôi thêmtaskAffinity bên trong của khối (AndroidManifest.xml)

Sau đó, bạn có thể sử dụng nó làm hoạt động thường xuyên.

Intent intentPhoneCall = new Intent(context, CallActivity.class); 
intentPhoneCall.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
intentPhoneCall.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
context.startActivity(intentPhoneCall); 

Hy vọng điều đó sẽ hữu ích. Happy codings.

3

Cách tốt nhất là để thực hiện một hoạt động và thiết lập của nó "Theme" thuộc tính để "Theme.Translucen"

<activity 
     android:name=".MyAlertDialog" 
     android:label="@string/title_activity_alert_dialog" 
     android:launchMode="singleInstance" 
     android:theme="@android:style/Theme.Translucent" > 
    </activity> 

và trong hoạt động của bạn tạo ra một hộp thoại cảnh báo:

public class MyAlertDialog extends Activity { 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    requestWindowFeature(Window.FEATURE_NO_TITLE); //hide activity title 
    setContentView(R.layout.activity_my_alert_dialog); 

    AlertDialog.Builder Builder=new AlertDialog.Builder(this) 
      .setMessage("Do You Want continue ?") 
      .setTitle("exit") 
      .setIcon(android.R.drawable.ic_dialog_alert) 
      .setNegativeButton(R.string.No, new DialogInterface.OnClickListener() { 
       @Override 
       public void onClick(DialogInterface dialog, int which) { 
        MyAlertDialog.this.finish(); 
       } 
      }) 
      .setPositiveButton(R.string.Yes,null); 
    AlertDialog alertDialog=Builder.create(); 
    alertDialog.show(); 

} 

} 

và trong brodcastreciver:

@Override 
public void onReceive(Context context, Intent intent) { 

    Intent i=new Intent(context.getApplicationContext(),MyAlertDialog.class); 
    i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
    context.startActivity(i); 

} 
} 
0
  1. Hiển thị hộp thoại từ Broa dcast Nhận là không thể.
  2. chúng tôi sẽ chỉ hiển thị Hộp thoại từ Hoạt động.
  3. Nhưng ngữ cảnh ứng dụng của bạn chỉ có Broadcast Receiver, sau đó chúng tôi sẽ khởi chạy hoạt động dưới dạng "FLAG_ACTIVITY_NEW_TASK", sau đó nó tạo ngăn xếp.
  4. Nếu chúng tôi Khởi chạy hoạt động với cờ này "FLAG_ACTIVITY_NEW_TASK", chúng tôi không thể xóa khỏi ngăn xếp. Vì vậy, sau khi đóng ứng dụng, sau đó chúng tôi đang cố gắng khởi động ứng dụng từ ngăn xếp, nó hiển thị cùng một Hoạt động, vì hoạt động này có cờ "FLAG_ACTIVITY_NEW_TASK", vì vậy nó không nên tạo phiên bản mới và sử dụng phiên bản hiện tại.

Nhưng chúng tôi chỉ muốn hiển thị hộp thoại một lần. vì điều này chúng ta cần xử lý đồng minh có lập trình.

if (count == 0) { 
      mBuilder = new Dialog(this); 
      mMsg = getIntent().getStringExtra(AlarmSchedulerUtils.EXTRA_MSG); 
      Uri notification = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM); 
      mRingTome = RingtoneManager.getRingtone(ReminderDialog.this, notification); 
      mRingTome.play(); 
      count++; 
      showReminderDialog(); 
     } else { 
      Intent intent=new Intent(ReminderDialog.this,SplashActivity.class); 
      startActivity(intent); 
      finish(); 
     } 

Điều này phù hợp với tôi.

Các vấn đề liên quan