リモートデータベースで新しいレコードを継続的にチェックし、新しいレコードが追加された場合に通知を提供する Android アプリケーションを作成しようとしています。追加されるすべてのレコードに対してこれを繰り返したい。
私はこれまでに次のことを行ってきました データベースからデータをフェッチするサービスを作成しました。一定の間隔でサービスを何度も呼び出すか、サービスを稼働させ続けてメソッドを繰り返し呼び出す最善の方法を誰かが提案できますか。より良いパフォーマンスを証明するものは何ですか?
リモートデータベースで新しいレコードを継続的にチェックし、新しいレコードが追加された場合に通知を提供する Android アプリケーションを作成しようとしています。追加されるすべてのレコードに対してこれを繰り返したい。
私はこれまでに次のことを行ってきました データベースからデータをフェッチするサービスを作成しました。一定の間隔でサービスを何度も呼び出すか、サービスを稼働させ続けてメソッドを繰り返し呼び出す最善の方法を誰かが提案できますか。より良いパフォーマンスを証明するものは何ですか?
リモート データベースで新しいレコードを継続的にチェックすると、アプリケーションに負荷がかかります。
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 を見つけて、パッケージ名に置き換えます。
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());
}
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();
}
}
}
}
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 をインストールします。