2015-08-15 96 views
-1

你好,我想打一个应用程序,将检查每30分钟背景的互联网连接,如果是的话,将一些非常小的JSON数据发送到服务器。检查互联网连接,每30分钟

不知道,如果这样做的权利,但现在我有:

package com.example.lenovotp.sender; 

import android.app.AlarmManager; 
import android.app.IntentService; 
import android.app.PendingIntent; 
import android.content.Context; 
import android.content.Intent; 
import android.net.ConnectivityManager; 
import android.net.NetworkInfo; 
import android.widget.Toast; 

import java.util.Calendar; 


public class MyClass extends IntentService{ 
    private static final String TAG = "com.example.lenovotp.sender"; 
    private AlarmManager alarmMgr; 
    private PendingIntent alarmIntent; 
    Calendar calendar = Calendar.getInstance(); 
    public MyClass(){ 
     super(""); 
    } 

    @Override 
    protected void onHandleIntent(Intent intent) { 
     AlarmManager alarmMgr = (AlarmManager) getSystemService(Context.ALARM_SERVICE); 
    intent = new Intent(this, MyClass.class); 
    PendingIntent alarmIntent = PendingIntent.getService(this, 0, intent, 0); 
    alarmMgr.set(AlarmManager.RTC_WAKEUP, 
      1000 * 30, alarmIntent); 

    ConnectivityManager cm = 
      (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); 

    NetworkInfo activeNetwork = cm.getActiveNetworkInfo(); 
    boolean isConnected = activeNetwork != null && 
      activeNetwork.isConnectedOrConnecting(); 
    //boolean isWiFi = activeNetwork.getType() == ConnectivityManager.TYPE_WIFI; 
    if(isConnected!=false){ 
     Toast.makeText(this, "Network is avail!", Toast.LENGTH_LONG).show(); 
    } else { 
     Toast.makeText(this, "Network is NOT avail!", Toast.LENGTH_LONG).show(); 
    } 

    } 
} 

而且在表现我在最后postition的是

<?xml version="1.0" encoding="utf-8"?> 

<!-- Permissions --> 
<uses-permission android:name="android.permission.INTERNET" /> 
<uses-permission android:name="android.permission.WAKE_LOCK" /> 
<uses-permission android:name="android.permission.GET_ACCOUNTS" /> 
<uses-permission android:name="android.permission.USE_CREDENTIALS" /> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> 
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> 
<uses-permission android:name="android.permission.WAKE_LOCK"/> 
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/> 

<application 
    android:allowBackup="true" 
    android:icon="@mipmap/ic_launcher" 
    android:label="@string/app_name" 
    android:theme="@style/AppTheme" > 
    <activity 
     android:name=".MainActivity" 
     android:label="@string/app_name" > 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 
    <service android:name=".MyClass"/> 
</application> 

并在MainActivity

package com.example.lenovotp.sender; 

import android.content.Intent; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.view.Menu; 
import android.view.MenuItem; 

public class MainActivity extends AppCompatActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     Intent intent = new Intent(this,MyClass.class); 
     startService(intent); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.menu_main, menu); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     // Handle action bar item clicks here. The action bar will 
     // automatically handle clicks on the Home/Up button, so long 
     // as you specify a parent activity in AndroidManifest.xml. 
     int id = item.getItemId(); 

     //noinspection SimplifiableIfStatement 
     if (id == R.id.action_settings) { 
      return true; 
     } 

     return super.onOptionsItemSelected(item); 
    } 
} 

所以,现在我不知道如何:

  1. 赚的应用程序没有运行,或者由用户摧毁它。
  2. 它每30分钟检查一次连接,如果是的话,它会发送一些数据到服务器。

在此先感谢。

修订

+0

所以你想做什么?你想发送数据还是要检查连接? –

+0

我想发送数据。 – comingage

+1

如果时间到了,并且没有连接,该怎么办?你想发送的数据怎么样? –

回答

4

有几件事情:

  1. 子类IntentService代替Service。服务在主(UI)线程上运行,但IntentService将在后台线程(在onHandleIntent())中完成其工作,并且在完成工作后自动停止。
  2. 在你的服务,使用AlarmManager来安排你的下一个“唤醒”在30分钟内。你可以找到很多例子,如何在网络中使用AlarmManager
  3. 您可能需要一种方法来安排设备引导后第一次“唤醒”您的服务。为此,您需要清单中的BroadcastReceiver,该清单已注册接收ACTION_BOOT_COMPLETED广播。这要求您具有RECEIVE_BOOT_COMPLETED权限。这个例子也遍布整个网络。
+0

你好,请你能更具体如何落实AlarmManager在onHandleIntent(),我已经有了?我在网络上的所有例子中都很迷茫。 – comingage

+1

@ N.tsrg 1.您需要使用'PendingIntent.getService()','不PendingIntent.getBroadcast()',因为其目的是为服务类。 2.警报间隔以毫秒为单位。现在你有'1000 * 30',这是30秒,而不是30分钟。你需要乘以60得到30分钟。 3.我不认为你需要'setRepeating()',因为每次服务运行它应该安排下一次唤醒。我认为'setExact()'(或者'set()'在API 19以下)就足够了。那有意义吗? – Karakuri

+0

不幸的是我做的改变是有道理的,但它没有显示烤面包。也许我是在错误的课上做的。 30秒是有目的的,看看它是否有效,当我关掉互联网时发生变化。如果服务声明在onHandleIntent之下并且只是在它中调用,并且对于alarmManager是相同的,将会有所帮助吗? – comingage