2012-03-12 16 views
0

私はC2DMのセットアップと作業をしています。また、ユーザーIDを自分のサーバーに送信するので、メッセージを送信することができます。しかし私はユーザーの登録状態を警告するUIの更新には苦労しています。私が持っている問題は、アクティビティではないクラスで登録が処理されるため、ユーザに警告する方法を理解するのに苦労していることです。これが正常に登録プロセスを起動さC2DM登録クラスのAndroidアップデートUI

import android.app.Activity; 
import android.app.Dialog; 
import android.app.PendingIntent; 
import android.content.Intent; 
import android.os.Bundle; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.EditText; 

public class RegistrationScreen extends Activity { 


    public static int status; 
    public static String userID; 
    public static String regPass; 
    public static int bankID=201; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.registrationscreen); 

     Button btn1 = (Button)findViewById(R.id.registerSubmitButton); 
     btn1.setOnClickListener(new OnClickListener() 
     { 

      @Override 
      public void onClick(View arg0) { 
       //Get data from form 
       final EditText userIdText = (EditText) findViewById(R.id.userID); 
       userID = userIdText.getText().toString(); 

       final EditText userPasswordText = (EditText) findViewById(R.id.userPassword); 
       regPass = userPasswordText.getText().toString(); 


       register(); 
      } 

     }); 
    } 

    protected Dialog onCreateDialog(int id) { 
     switch (id) { 
     case 0: 
      Dialog superSimpleDlg = new Dialog(this); 
      superSimpleDlg.setTitle("blah"); 
      return superSimpleDlg; 

     } 
     return null; 
    } 
    private void register() { 
     status=1; //1= being processed 
     String emailOfSender ="*removed*"; 
     Intent registrationIntent = new Intent("com.google.android.c2dm.intent.REGISTER"); 
     registrationIntent.putExtra("app", PendingIntent.getBroadcast(this, 0, new Intent(), 0)); // boilerplate 
     registrationIntent.putExtra("sender", emailOfSender); 
     startService(registrationIntent); 

     //  while(status==1){ 
     //   
     //  } 

     showDialog(0); 
     //TODO Show "Registering..." dialogue??? 

    } 
} 

は、私は次のことを持っているクラスのRegistrationScreen」を持っています。しかし、登録プロセスを経ている間は「処理ダイアログ」を表示し、登録に成功すると「確認ダイアログ」を表示したいと思います。

私は別のクラスのC2DMReceiver「Googleのサーバーへの登録を処理し、また私自身のサーバーに登録するソケットを使用しています。

import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.content.SharedPreferences.Editor; 
import android.os.Bundle; 
import android.util.Log; 

public class C2DMReceiver extends BroadcastReceiver { 
    private static String KEY = "c2dmPref"; 
    private static String REGISTRATION_KEY = "registrationKey"; 

    private Context context; 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     this.context = context; 
     if (intent.getAction().equals("com.google.android.c2dm.intent.REGISTRATION")) { 
      handleRegistration(context, intent); 
     } else if (intent.getAction().equals("com.google.android.c2dm.intent.RECEIVE")) { 
      handleMessage(context, intent); 
     } 
    } 

    private void handleRegistration(Context context, Intent intent) { 
     String registration = intent.getStringExtra("registration_id"); 
     if (intent.getStringExtra("error") != null) { 
      // Registration failed, should try again later. 
      Log.d("c2dm", "registration failed"); 
      String error = intent.getStringExtra("error"); 
      if(error == "SERVICE_NOT_AVAILABLE"){ 
       Log.d("c2dm", "SERVICE_NOT_AVAILABLE"); 
      }else if(error == "ACCOUNT_MISSING"){ 
       Log.d("c2dm", "ACCOUNT_MISSING"); 
      }else if(error == "AUTHENTICATION_FAILED"){ 
       Log.d("c2dm", "AUTHENTICATION_FAILED"); 
      }else if(error == "TOO_MANY_REGISTRATIONS"){ 
       Log.d("c2dm", "TOO_MANY_REGISTRATIONS"); 
      }else if(error == "INVALID_SENDER"){ 
       Log.d("c2dm", "INVALID_SENDER"); 
      }else if(error == "PHONE_REGISTRATION_ERROR"){ 
       Log.d("c2dm", "PHONE_REGISTRATION_ERROR"); 
      } 
     } else if (intent.getStringExtra("unregistered") != null) { 
      // unregistration done, new messages from the authorized sender will be rejected 
      Log.d("c2dm", "unregistered"); 

     } else if (registration != null) { 
      Log.d("c2dm", registration); 
      Editor editor = 
        context.getSharedPreferences(KEY, Context.MODE_PRIVATE).edit(); 
      editor.putString(REGISTRATION_KEY, registration); 
      editor.commit(); 
      registerWithServer(registration); 
      // Send the registration ID to the 3rd party site that is sending the messages. 
      // This should be done in a separate thread. 
      // When done, remember that all registration is done. 
     } 
    } 

    private void handleMessage(Context context, Intent intent) 
    { 
     Bundle extras = intent.getExtras(); 
     if (extras != null) { 
      // String blah = (String) extras.get("POSTFIELDS"); 
      Log.d("c2dm", "recieved: "+extras.getString("message")); 

     } 

    } 

    private void registerWithServer(String c2dmID) { 
     String hostname = "10.0.2.2"; 
     int port = 54321; 

     socketClient client = new socketClient(hostname, port); 
     String message = client.sendMessage("registerRSA|c2dmID="+c2dmID+",userID="+RegistrationScreen.userID+",bankID="+RegistrationScreen.bankID+",passcode="+RegistrationScreen.regPass+",deviceID=njfdfdsj389rfb,timestamp=00000,"); 
     Log.v("SOCKETCLIENT",message); 

     //Do actions on input string 
     String tokens[] = message.split("\\|"); 
     System.out.println(tokens[0]); 
     // 

     if (tokens[0].equals("success")) { 
      RegistrationScreen.status=100; 

     } else if (tokens[0].equals("error")) { 
      int errorID = 0; 
      String friendlyErrorMessage = null; 
      //Split the , then the = 
      String variables[] = tokens[1].split(","); 
      for (int i=0; i<variables.length; i++) { 
       String tempSplit[] = variables[i].split("="); 
       if (tempSplit[0].equals("errorID")) { 
        errorID=Integer.parseInt(tempSplit[1]); 
       } else if (tempSplit[0].equals("friendlyErrorMessage")) { 
        friendlyErrorMessage=tempSplit[1]; 
       } 
      } 

      //Update UI to alert of error 
      //TextView textViewToChange = (TextView) findViewById(R.id.registerTextHeader); 
      //textViewToChange.setText("Error getting seed! (ERR" + errorID + ") " + friendlyErrorMessage); 
      RegistrationScreen.status=200; 

     } else { 
      RegistrationScreen.status=300; 

      //unknown problem 
     } 
    } 

} 

あなたは、私が「状態」変数をチェックするwhileループを使用してそれを達成しようとしている見ることができるように、しかし、これは、プログラムがハングアップする原因となり、非常に効率的なプログラミングのように見えるしていません。

答えて

2

この場合、SharedPreferenceListenerを使用できます。

ユーザ登録が成功したら、これを試してみてください:

SharedPreferences prefs = PreferenceManager 
.getDefaultSharedPreferences(this.getApplicationContext()); 
Editor edit = prefs.edit(); 
edit.putBoolean("isRegistered",true).commit(); 

ユーザー登録解除が成功したら、これを試してみてください:

SharedPreferences prefs = PreferenceManager 
.getDefaultSharedPreferences(this.getApplicationContext()); 
Editor edit = prefs.edit(); 
edit.putBoolean("isRegistered",false).commit(); 

そして、あなたの活動に、 は(のTextViewを作成します。この例ではtextviewを使用しています)。 このコードをOnCreate()のどこかに置くことができます。

SharedPreferences prefs = PreferenceManager 
.getDefaultSharedPreferences(this.getApplicationContext()); 
OnSharedPreferenceChangeListener listener; 
listener = new SharedPreferences.OnSharedPreferenceChangeListener() { 
     @Override 
     public void onSharedPreferenceChanged(SharedPreferences arg0, 
     String key) { 

     if (key.equalsIgnoreCase("isRegistered")) { 

      Log.v("RegistrationScreen", "registration status changed");    
      if (prefs.getBoolean("isRegistered", false)) 
       { 
        textView.setText("Registered Successfully"); 
       } 
       else 
       { 
        textView.setText("Successfully UnRegistered"); 
       } 
     } 
    } 
}; 
    prefs.registerOnSharedPreferenceChangeListener(listener); 

...この情報がお役に立てば幸いです
関連する問題