質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.37%

AppWidgetが突然動かなくなりました。

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 2,088

sanniichikei

score 12

前提・実現したいこと

AppWidgetの開発をしている開発初心者です。
仕様は以下の通りです。
・ImageBottun_WorldMapをクリックするとClickWorldMapアクティビティ(今は空の画面を表示するだけ)に遷移する。
・現在の月日時分を表示する

発生している問題・エラーメッセージ

今日の昼頃までは順調に進んでいたのですが、
ある時突然実機でRunしても時刻が更新されなくなり、
画面遷移もできなくなりました。

ウィジェット自体は表示されます。

該当のソースコード

マニフェストファイル

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.vmt_038.widgettest6"
    android:versionCode="1"
    android:versionName="1.0">

    <uses-sdk
        android:minSdkVersion="17"
        android:targetSdkVersion="23" />

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name">

        <android:users-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
        <android:users-permission android:name="android.permission.READ_PHONE_STATE" />
        <android:users-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

        <receiver android:name=".MainActivity">
            <intent-filter>
                <!--<action android:name="android.intent.action.MAIN" />-->
                <!--<category android:name="android.intent.category.LAUNCHER" />-->
                <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
                <action android:name="com.example.(略).widgettest6.CLICK" />
            </intent-filter>

            <meta-data
                android:name="android.appwidget.provider"
                android:resource="@xml/widget_info" />
        </receiver>
        <service android:name=".UpdateWidgetService">
            <intent-filter>
                <action android:name="com.example.(略).widgettest6.CLICK" />
            </intent-filter>
        </service>

        <receiver android:name=".ReceivedActivity" android:process=":remote" />

        <activity
            android:name=".ClickWorldMap">
        </activity>

    </application>

</manifest>

MainActivity

import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.Context;
import android.content.Intent;

//ウィジェット実行に必要なクラスを継承したMainActivityクラスを生成する
public class MainActivity extends AppWidgetProvider {


    //AppWidgetProviderにあるonUpdateを、このクラスが実行されている場合のみ下記に書き換える
    @Override
    //ウィジェットが更新されたときに呼び出されるメソッド
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {

        //onUpdateをスーパークラスに設定
        super.onUpdate(context, appWidgetManager, appWidgetIds);

//        Toast.makeText(context, "表示", Toast.LENGTH_SHORT).show();
        //UpdateWidgetServiceへアクティビティを移行するためのインテントを作成
        Intent intent = new Intent(context.getApplicationContext(), UpdateWidgetService.class);
        //intentにデータを追加する
        intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, appWidgetIds);
        //アクティビティ移行開始
        context.startService(intent);
    }

    @Override
    public void onReceive(Context ctx, Intent intent) {
        super.onReceive(ctx, intent);
    }


}

UpdateWidgetService

import android.app.PendingIntent;
import android.app.Service;
import android.appwidget.AppWidgetManager;
import android.content.ComponentName;
import android.content.Intent;
import android.os.IBinder;
import android.widget.RemoteViews;
import android.widget.Toast;

import java.util.Calendar;
import java.util.Locale;

/**
 * Created by VMT-038 on 2016/06/08.
 */
//サービスクラス(ウィジェットをバックグラウンドで実行するクラス)を継承したUpdateWidgetServiceクラスを作成する
public class UpdateWidgetService extends Service {
//    @SuppressWarnings("deprecation")

    private final String filter = "com.example.(略).widgettest6.CLICK";

    RemoteViews remoteViews;

    /*---------*/
    /* OnStart */
    /*---------*/
    //ServiceにあるonStartCommandを、このクラスが実行されている場合のみ下記に書き換える
    @Override
    //Serviceが実行されると呼び出されるメソッド
    public int onStartCommand(Intent intent, int flags, int startId) {
        //onStartCommandをスーパークラスに設定
        super.onStartCommand(intent, flags, startId);
        //クラス起動トースト表示
        Toast.makeText(this, "起動", Toast.LENGTH_SHORT).show();

        //ウィジェットを表示する
        remoteViews = new RemoteViews(getPackageName(), R.layout.activity_main);
        //世界地図クリック時のイベント
        ClickImageButtonWorldMap();
        //反転フラップ部分更新
        SplitFlapDisplay();
        //ウィジェット更新
        UpdateAppWidget();
        //リターン値が必要だがなんでもいいらしい
        return flags;
    }

    public void SplitFlapDisplay() {
        //カレンダーメソッド起動トースト表示
        Toast.makeText(this, "カレンダー", Toast.LENGTH_SHORT).show();
        //カレンダーの値を取得
        Calendar calendar = Calendar.getInstance(Locale.getDefault());
        //int型に端末の現在時間の月を設定(toString使用不可)
        int month = calendar.get(Calendar.MONTH);
        //int型に端末の現在時間の日を設定(toString使用不可)
        int date = calendar.get(Calendar.DATE);
        //int型に端末の現在時間の時間を設定(toString使用不可)
        int hour = calendar.get(Calendar.HOUR_OF_DAY);
        //int型に端末の現在時間の分を設定(toString使用不可)
        int minute = calendar.get(Calendar.MINUTE);

        //月を英語省略形に変換
        String strmonth = month(month);

        //時間を表示(""+でint型をString型にキャストする)
        remoteViews.setTextViewText(R.id.textView_1stDepMonth, strmonth);
        //時間を表示(""+でint型をString型にキャストする)
        remoteViews.setTextViewText(R.id.textView_1stDepDate, "" + date);
        //時間を表示(""+でint型をString型にキャストする)
        remoteViews.setTextViewText(R.id.textView_1stDepHour, "" + hour);
        //時間を表示(""+でint型をString型にキャストする)
        remoteViews.setTextViewText(R.id.textView_1stDepMinute, "" + minute);
    }

    public void UpdateAppWidget() {
        //更新メソッド起動トースト表示
        Toast.makeText(this, "更新", Toast.LENGTH_SHORT).show();
        //更新するウィジェットを指定
        ComponentName thisWidget = new ComponentName(this, MainActivity.class);
        //?
        AppWidgetManager manager = AppWidgetManager.getInstance(this);
        // AppWidgetの画面更新
        manager.updateAppWidget(thisWidget, remoteViews);
    }

    public void ClickImageButtonWorldMap() {
        //ボタンタップメソッド起動トースト表示
        Toast.makeText(this, "タップ", Toast.LENGTH_SHORT).show();
        //画面遷移のためのインテント作成(ウィジェットは通常のIntentは使用不可)
        Intent buttonIntent = new Intent(this, ClickWorldMap.class);
        //ボタンが押された時に、ボタンが押されたことを告知する
        PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, buttonIntent, 0);
        //ボタンクリックによりインテント発行をする設定
        remoteViews.setOnClickPendingIntent(R.id.ImageButton_WorldMap, pendingIntent);
    }

    String month(int month) {
        String strmonth = "メンテナンス中";
        switch (month) {
            case 0:
                strmonth = "Jan.";
                break;
            case 1:
                strmonth = "Feb.";
                break;
            case 2:
                strmonth = "Mar.";
                break;
            case 3:
                strmonth = "Apr.";
                break;
            case 4:
                strmonth = "May";
                break;
            case 5:
                strmonth = "Jun.";
                break;
            case 6:
                strmonth = "Jul.";
                break;
            case 7:
                strmonth = "Aug.";
                break;
            case 8:
                strmonth = "Sep.";
                break;
            case 9:
                strmonth = "Oct.";
                break;
            case 10:
                strmonth = "Nov.";
                break;
            case 11:
                strmonth = "Dec.";
                break;
        }
        return strmonth;
    }


    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }
}

試したこと

不覚にもトラブルが起きた時に保存していなかったため、うまく動いていた時の状態に戻ることができませんでした。

遷移・表示更新ができていたときから、デバッグしても

Could not identify launch activity: Default Activity not found
Error while Launching activity

というエラーが出ていますが、原因がわからず、
とりあえずウィジェットはインストールできていたので開発を進めています。

トーストを作成してもどこのトーストも出現しないので、マニフェストファイルの異常と考えています。

補足情報(言語/FW/ツール等のバージョンなど)

AndroidStudio2.1で開発中

よろしくお願いします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

check解決した方法

0

すみません、解決しました。

Logcatというツールを同僚に教えてもらい(超初歩的で申し訳ありません)、確認したところ、
process is bad というエラーが出ていたので検索してみました。

原因は不明とのことでしたが、実機の再起動により解決できるという方がいたため、実機を再起動したところ、無事実行できました。

デバッグ用のUSBケーブルの接触が悪いことが原因の一つかもしれません。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.37%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る