0

リモートデータベースで新しいレコードを継続的にチェックし、新しいレコードが追加された場合に通知を提供する Android アプリケーションを作成しようとしています。追加されるすべてのレコードに対してこれを繰り返したい。

私はこれまでに次のことを行ってきました データベースからデータをフェッチするサービスを作成しました。一定の間隔でサービスを何度も呼び出すか、サービスを稼働させ続けてメソッドを繰り返し呼び出す最善の方法を誰かが提案できますか。より良いパフォーマンスを証明するものは何ですか?

4

1 に答える 1

1

リモート データベースで新しいレコードを継続的にチェックすると、アプリケーションに負荷がかかります。

Google Cloud を使用してデバイス メッセージング サービスを利用できます。これにより、リモート データベースに新しいレコードが作成されるたびに、デバイスに通知メッセージが送信されます。

これを確認してください: http://developer.android.com/google/gcm/index.html

GCM の手順

1.AndroidManifest.xmlに以下のパーミッションとレシーバーを追加

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />

<permission android:name="com.example.test.permission.C2D_MESSAGE" 
    android:protectionLevel="signature" />
<uses-permission android:name="com.example.test.permission.C2D_MESSAGE" />

 <receiver
        android:name="com.example.test.MyBroadcastReceiver"
        android:permission="com.google.android.c2dm.permission.SEND" >
        <intent-filter>
            <action android:name="com.google.android.c2dm.intent.RECEIVE" />
            <action android:name="com.google.android.c2dm.intent.REGISTRATION" />
            <category android:name="com.example.test" />
        </intent-filter>
    </receiver>

注: com.example.test を見つけて、パッケージ名に置き換えます。

  1. MyBroadcastReceiver.java

    public class MyBroadcastReceiver extends BroadcastReceiver{
    
        private static final String TAG = "GCM";
        MyPrefs myPrefs ;
    
    @Override
    public void onReceive(Context context, Intent intent) {
    
    myPrefs = new MyPrefs(context);
    
    Log.d(TAG,"inside onReceive");
    
    String action = intent.getAction();
    if (action.equals("com.google.android.c2dm.intent.REGISTRATION")) {
    
        handleRegistration(context,intent);
    } else if (action.equals("com.google.android.c2dm.intent.RECEIVE")) {
    
    
        handleMessage(context,intent);
    }
    }
    private void handleRegistration(Context context,Intent intent) {
    String registrationId = intent.getStringExtra("registration_id");
    String error = intent.getStringExtra("error");
    String unregistered = intent.getStringExtra("unregistered");       
    
    // registration succeeded
    if (registrationId != null) {
        Log.d(TAG, "Device_reg_id : "+registrationId);
    
        // store registration ID on shared preferences
        myPrefs.putString("DEVICE_REG_ID", registrationId);
    
        // notify 3rd-party server about the registered ID
        generateNotification(context, "Registration Sucessful", "Device register sucessfully!");
    }
    
    // unregistration succeeded
    if (unregistered != null) {
        // get old registration ID from shared preferences
        // notify 3rd-party server about the unregistered ID
    } 
    
    // last operation (registration or unregistration) returned an error;
    if (error != null) {
        if ("SERVICE_NOT_AVAILABLE".equals(error)) {
            // optionally retry using exponential back-off
            // (see Advanced Topics)
        } else {
            // Unrecoverable error, log it
            Log.i(TAG, "Received error: " + error);
        }
    }
    }
    private void handleMessage(Context context, Intent intent) {
    
    String data = intent.getExtras().getString("data");
    generateNotification(context, "New Message is received", data);
    }
    
    private void generateNotification(Context context,String title,String text) {
    
    NotificationCompat.Builder mBuilder = 
            new NotificationCompat.Builder(context)
            .setSmallIcon(R.drawable.ic_launcher)
            .setContentTitle(title)
            .setContentText(text);
    
    // Creates an explicit intent for an Activity in your app
    Intent resultIntent = new Intent(context, MainActivity.class);
    
    PendingIntent resultPendingIntent = PendingIntent.getBroadcast(context,0,resultIntent, 0);     
    mBuilder.setContentIntent(resultPendingIntent);
    
    NotificationManager mNotificationManager =
        (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
    // mId allows you to update the notification later on.
    mNotificationManager.notify(0, mBuilder.build());
     }
    
  2. MainActivity.java

    public class MainActivity extends Activity {
    
     String device_reg_id;
    
     @Override
     public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    
    MyPrefs prefs = new MyPrefs(this);
    device_reg_id = prefs.getString("DEVICE_REG_ID"); 
    
    if (device_reg_id == null )
    {
        Log.d("GCM", "Registration start");
        // registration 
        Intent registrationIntent = new Intent("com.google.android.c2dm.intent.REGISTER");
        // sets the app name in the intent
        registrationIntent.putExtra("app", PendingIntent.getBroadcast(this, 0, new Intent(), 0));
        registrationIntent.putExtra("sender", "1850XXXX2785");
        startService(registrationIntent);
    }else
    {
        // send a message to device its self
    
            String api_key = "AIzaSyBXSJHPqFiYeYdAoYfN1XlI20Es";
    
            Sender sender = new Sender(api_key);
    
            Message message = new Message.Builder()
            .collapseKey("1")
            .timeToLive(3)
            .delayWhileIdle(true)
            .addData("data", "Welcome!")
            .build();
    
            Result result;
            try {
                result = sender.send(message, device_reg_id, 5);
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
          }
        }
      }
    
  3. MyPrefs.java

    public class MyPrefs {
    
     private SharedPreferences sp;
     private Editor editor;
    
     public MyPrefs(Context context){
            sp = PreferenceManager.getDefaultSharedPreferences(context);
            editor = sp.edit();
     }
    public void putString(String key,String Value){
              editor.putString(key,Value);
              editor.commit();
    }
    public String getString(String key){
           return sp.getString(key,null);
     }
    }
    

sdk\extras\google\gcm\gcm-server\dist から gcm -server.jarをインポートすることを忘れないでくださいSDK でパスが見つからない場合は、Android SDK Manager の Extras の下に Google Cloud Messaging for Android Libaray をインストールします。

于 2013-03-05T11:44:30.467 に答える