[英]Update android (homescreen) widget from php file
我想制作一個可從php文件更新的android小部件。 我發現了很多關於小部件的示例,以及很多關於如何從php到活動中檢索數據的示例,但是我沒有做到這一點。 我需要類似此示例的內容( http://www.vogella.com/tutorials/AndroidWidgets/article.html ),但我需要從我的php文件中獲取該數字,而不是隨機數。
php文件,它輸出一個我需要包含在小部件中的數字( http://www.angryboards.com/data/larnaca/test.php )
這是WidgetProvider類,但是當我嘗試在onUpdate()中調用AsyncTask時會崩潰。
public class MyWidgetProvider extends AppWidgetProvider {
private TextView textView;
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager,
int[] appWidgetIds) {
//call AsyncTask
String serverURL = "http://www.angryboards.com/data/larnaca/test.php";
new async().execute(serverURL);
String txt = textView.getText().toString();
// Get all ids
ComponentName thisWidget = new ComponentName(context,
MyWidgetProvider.class);
int[] allWidgetIds = appWidgetManager.getAppWidgetIds(thisWidget);
for (int widgetId : allWidgetIds) {
RemoteViews remoteViews = new RemoteViews(context.getPackageName(),
R.layout.widget_layout);
// Set the text
remoteViews.setTextViewText(R.id.update, txt);
// Register an onClickListener
Intent intent = new Intent(context, MyWidgetProvider.class);
intent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, appWidgetIds);
PendingIntent pendingIntent = PendingIntent.getBroadcast(context,
0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
remoteViews.setOnClickPendingIntent(R.id.update, pendingIntent);
appWidgetManager.updateAppWidget(widgetId, remoteViews);
}
}
private class async extends AsyncTask<String, Void, String> {
@Override
protected String doInBackground(String... urls) {
String response = "";
for (String url : urls) {
DefaultHttpClient client = new DefaultHttpClient();
HttpGet httpGet = new HttpGet(url);
try {
HttpResponse execute = client.execute(httpGet);
InputStream content = execute.getEntity().getContent();
BufferedReader buffer = new BufferedReader(new InputStreamReader(content));
String s = "";
while ((s = buffer.readLine()) != null) {
response += s;
}
} catch (Exception e) {
e.printStackTrace();
}
}
return response;
}
@Override
protected void onPostExecute(String result) {
textView.setText(result);
}
}
}
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.tasos.widgettest"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
/>
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.tasos.widgettest.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>
<receiver
android:icon="@drawable/logo"
android:label="Example Widget"
android:name="MyWidgetProvider" >
<intent-filter >
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
</intent-filter>
<meta-data
android:name="android.appwidget.provider"
android:resource="@xml/widget_info" />
</receiver>
</application>
<uses-permission android:name="android.permission.INTERNET" />
</manifest>
widget_info.xml
<?xml version="1.0" encoding="utf-8"?>
<appwidget-provider
xmlns:android="http://schemas.android.com/apk/res/android"
android:initialLayout="@layout/widget_layout"
android:minHeight="72dp"
android:minWidth="300dp"
android:updatePeriodMillis="3000" >
</appwidget-provider>
在布局中,我有一個textview(android:id =“ @ + id / update”)謝謝
做完了! 我做了一個包含AsyncTask的服務,我從appwigdetprovider調用了該服務。
我的UpdateWidgetService.java
public class UpdateWidgetService extends Service {
public String string;
public String inputLine;
public StringBuilder txt;
public BufferedReader in;
public URL url;
@Override
public void onStart(Intent intent, int startId) {
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(this.getApplicationContext());
int[] allWidgetIds = intent.getIntArrayExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS);
for (int widgetId : allWidgetIds) {
RemoteViews remoteViews = new RemoteViews(this.getApplicationContext().getPackageName(),R.layout.widget_layout);
Intent clickIntent = new Intent(this.getApplicationContext(),MyWidgetProvider.class);
clickIntent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
clickIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS,allWidgetIds);
PendingIntent pendingIntent = PendingIntent.getBroadcast(getApplicationContext() , 0, clickIntent,PendingIntent.FLAG_UPDATE_CURRENT);
//refresh tapping the screen
remoteViews.setOnClickPendingIntent(R.id.update, pendingIntent);
new DownloadTask().execute();
appWidgetManager.updateAppWidget(widgetId, remoteViews);
}
stopSelf();
super.onStart(intent, startId);
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
public class DownloadTask extends AsyncTask<String, Void, String> {
@Override
protected String doInBackground(String... arg0) {
try {
url = new URL("http://www.angryboards.com/data/larnaca/latest_wind_value.php");
in = new BufferedReader(new InputStreamReader(url.openStream()));
inputLine = null;
txt = new StringBuilder();
while ((inputLine = in.readLine()) != null) {
string = in.readLine();
txt.append(inputLine);
txt.append('\n');
}
in.close();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(String result) {
AppWidgetManager widgetManager = AppWidgetManager.getInstance(getApplication());
//get widget ids for widgets created
ComponentName widget = new ComponentName(getApplication(), MyWidgetProvider.class);
int[] widgetIds = widgetManager.getAppWidgetIds(widget);
//update text
RemoteViews remoteViews = new RemoteViews(getPackageName(), R.layout.widget_layout);
remoteViews.setTextViewText(R.id.update, txt);
//refresh widget to show text
widgetManager.updateAppWidget(widgetIds, remoteViews);
}
}
}
MyWidgetProvider.java
public class MyWidgetProvider extends AppWidgetProvider {
private static final String LOG = "com.tasos.widgettest";
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager,
int[] appWidgetIds) {
Log.w(LOG, "onUpdate method called");
// Get all ids
ComponentName thisWidget = new ComponentName(context,
MyWidgetProvider.class);
int[] allWidgetIds = appWidgetManager.getAppWidgetIds(thisWidget);
// Build the intent to call the service
Intent intent = new Intent(context.getApplicationContext(),
UpdateWidgetService.class);
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, allWidgetIds);
// Update the widgets via the service
context.startService(intent);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.