2012-07-02 42 views
1

我想在IntentService類的onHandleIntent()方法打開自定義對話框,但是當我爲表示該方法對話框編寫代碼,它顯示錯誤「的方法findViewById( int)未定義爲類型MyAlarmService「。任何人都可以建議我如何解決這個問題。如何onHandleIntent打開對話框()的IntentService類的方法

代碼我已經使用

public class MyAlarmService extends IntentService 
{ 
public void onCreate() 
{ 
    super.onCreate(); 
} 

public MyAlarmService() 
{ 
    super("MyAlarmService"); 
} 

@Override 
public int onStartCommand(Intent intent, int flags, int startId) 
{ 
    super.onStartCommand(intent, startId, startId); 
    Toast.makeText(this, "MyAlarmService.onStart()", Toast.LENGTH_LONG).show(); 
    return START_STICKY; 
} 

@SuppressWarnings("static-access") 
@Override 
protected void onHandleIntent(Intent intent) 
{ 
    final Dialog alarmDialog = new Dialog(MyAlarmService.this); 
    alarmDialog .requestWindowFeature(alarmDialog.getWindow().FEATURE_NO_TITLE); 
    alarmDialog .getWindow().setBackgroundDrawable(new ColorDrawable(0)); 

    Context mContext = getApplicationContext(); 
    LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(LAYOUT_INFLATER_SERVICE); 
    View layout = inflater.inflate(R.layout.clear_all_warning_dialog, (ViewGroup) findViewById(R.id.layout_warning_dialog)); 

    TextView dialogTitile = (TextView) layout.findViewById(R.id.dialog_title_text); 

    TextView dialogDesc = (TextView) layout.findViewById(R.id.dialog_desc_text); 

    Button buttonYes = (Button) layout.findViewById(R.id.button_yes);    

    Button buttonNo = (Button) layout.findViewById(R.id.button_no);    

    alarmDialog.setContentView(layout); 
    alarmDialog.show(); 

    buttonYes.setOnClickListener(new OnClickListener() 
    {     
     @Override 
     public void onClick(View v) 
     { 
      alarmDialog.dismiss(); 
     } 
    }); 
    buttonNo.setOnClickListener(new OnClickListener() 
    {     
     @Override 
     public void onClick(View v) 
     { 
      alarmDialog.dismiss(); 
     } 
    }); 
} 
} 
+0

它可以顯示服務的對話? –

+0

但在我的情況下,我不得不使用IntentService類,所以你知道如何在IntentService類中顯示對話框。其次,如果我使用服務類我的應用程序總是顯示在運行過程,而不是緩存過程 – AndroidDev

回答

4

這是可以做到剛開始的活動,而不是思維充氣對話框:

@Override 
protected void onHandleIntent(Intent intent) { 
    synchronized (this) 
    { 
    startActivity(new Intent(this,ActivityXYZ.class).setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)); 
    } 
} 

充分利用對話框佈局(這是一個ActivityXYZ的佈局,您在上面開始),如:

<?xml version="1.0" encoding="UTF-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
android:background="#000" 
android:orientation="vertical" > 

<TextView 
    android:id="@+id/TextView01" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:layout_gravity="center_horizontal" 
    android:layout_margin="10dp" 
    android:gravity="center_horizontal" 
    android:text="Alert Dialog Message" 
    android:textColor="#fff" 
    android:textSize="16dp" > 
</TextView> 
<LinearLayout android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:gravity="center" 
    android:layout_marginBottom="5dp"> 

<Button 
    android:id="@+id/ButtonOk" 
    android:layout_width="150dp" 
    android:layout_height="wrap_content" 
    android:layout_marginTop="10dp" 
    android:text="Ok" 
    android:textColor="#000" 
    android:textSize="18sp" 
    android:textStyle="bold" > 
</Button> 

<Button 
    android:id="@+id/ButtonCancel" 
    android:layout_width="150dp" 
    android:layout_height="wrap_content" 
    android:layout_marginTop="10dp" 
    android:text="Cancel" 
    android:textColor="#000" 
    android:textSize="18sp" 
    android:textStyle="bold" 
    > 
</Button> 
</LinearLayout> 
</LinearLayout> 

並且在清單文件中包含這個活動的配置

android:theme="@android:style/Theme.Dialog" 

在爲該活動製作佈局時,只需在對話框中添加文本視圖和兩個按鈕,並且會給服務中的對話框充氣效果。

對於任何澄清讓我知道。 :))))

+0

你的意思是說,我可以開始一個新的活動,在那個活動中,我應該打開一個對話框。但是,這項活動是作爲一個dilaog打開..你可以用一個例子來解釋我 – AndroidDev

+0

不,它會彈出一個對話框。只是做一個活動,並在其佈局中放置兩個按鈕和一個文本視圖。在清單下添加(如上所述)代碼,在您定義它的活動名稱下,它肯定會起作用。對於2個按鈕,你可以把onClickListeners放在我的例子中,我用它來啓動一個HomeScreen,它讓我感覺像是從對話框啓動了一個應用程序。如果你仍然需要幫助或澄清,讓我知道,我會嘗試用代碼解釋。 – iabhi

+0

確保將其添加到運行服務的相同項目中。希望能幫助到你。 – iabhi

0

我不認爲你可以膨脹的看法在服務,因爲IntentService不會在UI線程上運行,另一個解決辦法是將你的服務綁定到您的活動並編寫一個監聽器,該監聽器將顯示對話框並將其註冊到onBind()方法中的服務。

您可以擴展您的服務方式如下:

public class MyAlarmService extends IntentService { 

    private MyListener mListener; 

    // Your implementation here 

    public void registerListener(MyListener listener){ 
     mListener = listener; 
    } 

    @Override 
    protected void onHandleIntent(Intent intent) { 
       listener.postToUIThread(); 

     // Other things you might want to do 
    } 

    @Override 
    public IBinder onBind(Intent intent) { 
     return new MyAlarmBinder(this); 
    } 

    @Override 
    public boolean onUnbind(Intent intent) { 
     return super.onUnbind(intent); 
    } 
} 

然後寫粘合劑和聽衆如下:

public class MyListener { 

    private Handler mHandler; 
    private Runnable mRunnable; 

    public MyListener(Handler handler, Runnable runnable){ 
     this.mHandler = handler; 
     this.mRunnable = runnable; 
    } 

    public void postToUIThread(){ 
     mHandler.post(mRunnable); 
    } 
} 

public class MyAlarmBinder extends Binder { 
    private WeakReference<MyAlarmService> mService; 

    public MyAlarmBinder(MyAlarmService service){ 
     mService = new WeakReference<MyAlarmService>(service); 
    } 

    public MyAlarmService getService(){ 
     return mService.get(); 
    } 
} 

注意,在監聽我使用的UI創建的處理程序線程將對話創建代碼發佈到UI線程。

並在您的主要活動,你可以把它放在一起:

private MyAlarmService mService; 

private Handler mHandler = new Handler; 
private Runnable mRunnable = new Runnable(){ 

    @Override 
    public void run(){ 
     // Show dialog here 
    } 
} 

private ServiceConnection mConnection = new ServiceConnection() { 

    public void onServiceConnected(ComponentName name, IBinder service) { 
     mService = ((MyAlarmBinder)service).getService(); 
     mService.registerListener(new MyListener(mHandler, mRunnable)); 
    } 

    public void onServiceDisconnected(ComponentName name) { 
     mService = null; 
    } 
}; 

@Override 
protected void onResume() { 
    super.onResume(); 
    bindService(new Intent(this, MyAlarmService.class), mConnection, 
     Context.BIND_AUTO_CREATE); 
} 

@Override 
protected void onPause() { 
    super.onPause(); 
    if(mConnection != null){ 
     unbindService(mConnection); 
    } 
} 

我沒有嘗試這一點,但稍作修改這應該解決您的問題。如果您有任何其他問題,請不要猶豫,問。

+0

你可以用一個簡單的例子顯示,如果可能的話 – AndroidDev

+0

我用例子更新了我的答案 –