2015年6月30日 星期二

Android-APP 啟動另一個 APP

用 APP 開啟另一個 APP
必須知道目標開啟的 Package  Name !!!

只需 Package Name ! 不是 MainAcitvity.java

 Intent intent = new Intent();
 PackageManager manager = getPackageManager();
 intent = manager.getLaunchIntentForPackage("com.example.activity");
 intent.addCategory(Intent.CATEGORY_LAUNCHER);
 startActivity(intent);

歡迎轉載,請註明出處。

Android-大量參考資料庫

ListView
連結位置 : 連結

Android-Parse DataBase 功能

查詢資料

ParseQuery<ParseObject> query = ParseQuery.getQuery("HELLO");
query.whereEqualTo("A", string);
query.getFirstInBackground(new GetCallback<ParseObject>() {
    public void done(ParseObject object, ParseException e) {
        if (object == null) {
            // 無資料
            Log.d("score", " not Retrieved the object.");
        } else {
            // 取得相對應資料
            Log.d("score", object.getString("NAME"));
        }
    }
});

Android-Parse Push 推波( Push )( 二 )

在上一篇有介紹如何匯入基本的Parse Jar
接下要介紹的是 : 推波 功能
  • 手機端發送推波
ParsePush push = new ParsePush(); 
push.setChannel("MyChannel"); 
push.setMessage("MyMessage"); 
push.sendInBackground();


2015年6月29日 星期一

Android-下拉更新視窗(Refresh ListView)

更新
20151213 : 新增 SwipeRefreshLayout 教學
20160318 : 新增 ListView 、GridView 更新問題

現在 UI 畫面不管是 ListView、 GridView 有做更新已經見怪不怪了
現在就來以原生的方法實作

1 . 把要更新的內容加載在 SwipeRefreshLayout 內
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <android.support.v4.widget.SwipeRefreshLayout 
        android:id="@+id/swipe_container" 
        android:layout_width="match_parent" 
        android:layout_height="match_parent" >

        <GridView
            android:id="@+id/gridView1"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:numColumns="3" >
        </GridView>
   
    </android.support.v4.widget.SwipeRefreshLayout>

</RelativeLayout>


2 . 在 Activity 宣告並且監聽動作
package com.example.refreshview;

import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.os.Handler;
import android.support.v4.widget.SwipeRefreshLayout;
import android.support.v4.widget.SwipeRefreshLayout.OnRefreshListener;
import android.widget.Toast;

public class MainActivity extends Activity implements OnRefreshListener{

    SwipeRefreshLayout mSwipeLayout;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mSwipeLayout = (SwipeRefreshLayout) findViewById(R.id.swipe_container);  
        mSwipeLayout.setOnRefreshListener(this);  
        mSwipeLayout.setColorSchemeColors(Color.RED);

    }

    @Override
    public void onRefresh() {

        // 模仿更新 ( 2秒
        Handler handler = new Handler();
        handler.postDelayed(new Runnable(){

            @Override
            public void run() {

                // 結束更新動畫
                mSwipeLayout.setRefreshing(false);
                Toast.makeText(MainActivity.this, "Refresh Success", Toast.LENGTH_SHORT).show();        

            }}, 2000);

    }
}


遇到的問題
當 ListView 、 GridView 向上滑動看資訊
但 向下滑動 竟然觸發到更新元件

解法 :
mListView.setOnScrollListener(new AbsListView.OnScrollListener() {  
  @Override
  public void onScrollStateChanged(AbsListView view, int scrollState) {

  }

  @Override
  public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
    int topRowVerticalPosition = 
      (mListView == null || mListView.getChildCount() == 0) ? 
        0 : mListView.getChildAt(0).getTop();
    swipeContainer.setEnabled(firstVisibleItem == 0 && topRowVerticalPosition >= 0);
  }
});


參考資料 : 如何使用下拉更新(SwipeRefreshLayout)
參考資料 : SwipeRefreshLayout with ListView done right

KeyWork : XListView
一般ListView
相關連結 : 位置

多種ListView GridView TextView
但要匯入SDK

相關連結 : 位置

看起來挺實用的但是限定AndroidStudio
實作過,超方便
但是下拉的圖示很尷尬..
Phoenix

2015年6月24日 星期三

Android-Parse Push 推波( Receiver )( 一 )

想必大家對推波不陌生吧
但距離上一次使用已經是1-2年前了
官方雖然已經出最新的SampleCode (AndroidStudio版本)
想必有些大大想要更精簡的版本吧

官方文件 : 連結
官方SDK : 連結

首先下載官方SDK

-----  匯入相對應的Jar -----
在SDK檔案底下找
重點是以下這兩個Jar( 只是Sample,非完整版本 ) :
1.9.2 版本
  1. bolts-android-1.2.0.jar
  2. Parse-1.9.2.jar 
  3. ParseCrashReporting-1.9.2.jar
1.10.2
  1. PPNS-1.10.2.jar
  2. compile 'com.parse:parse-android:1.10.1'
  3. compile 'com.parse.bolts:bolts-android:1.2.1'
1.10.3
    連結 : Box
-----  新增Application -----

public class MyApplication extends Application
{
    private static final String ApplicationID = "Your ID";
    private static final String ClientKey = "Your Key";

    @Override
    public void onCreate()
    {
        super.onCreate();
        Parse.initialize(this, ApplicationID, ClientKey);

        //initialized some stuff..
        
        ParsePush.subscribeInBackground("若加文字內容,代表指定接收頻道", 
            new SaveCallback()
        {

            @Override
            public void done(ParseException e)
            {
                if (null == e)
                {
                    ParseInstallation install = 
                        ParseInstallation.getCurrentInstallation();
                        
                    String token = install.getString("deviceToken");
                    //do some stuff with it...
                }
            }
        });
        ParseInstallation.getCurrentInstallation().saveInBackground();
        //some more stuff
    }
}

-----  AndroidManifest.xml 新增權限與服務 -----
  • 權限
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
  • 服務與監聽
<service android:name="com.parse.PushService" />

<receiver android:name="com.parse.ParseBroadcastReceiver" >
    <intent-filter>
         <action android:name="android.intent.action.BOOT_COMPLETED" />
         <action android:name="android.intent.action.USER_PRESENT" />
     </intent-filter>
</receiver>
<receiver
     android:name="com.parse.ParsePushBroadcastReceiver"
     android:exported="false" >
         <intent-filter>
                <action android:name="com.parse.push.intent.RECEIVE" />
                <action android:name="com.parse.push.intent.OPEN" />
                <action android:name="com.parse.push.intent.DELETE" />
          </intent-filter>
</receiver>

  • 註冊Application
<application
    android:name=".MyApplication"
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    .
    .
    .

如果遇到在Parse上錯誤
裡面有 ParseLog SDK 可以使用

Parse.setLogLevel(Parse.LOG_LEVEL_VERBOSE);

Parse.initialize(this, ApplicationID, ClientKey);

下一回會在介紹如果收到Parse Push如何處理。

參考資料 : PushService

歡迎轉載,請註明出處。


2015年6月22日 星期一

Android-AndroidStudio 熱鍵 Eclipse Keymap

想必有些大大從 Eclipse 跳到 Android Studio 後
所有熱鍵都無法去適應,就算調到Eclipse模式也未必都相同
以下列表示所有的熱鍵功能
AndroidStudio 是採用 IntelliJIDEA
基本都能互相通用
















如果結圖太小、搜尋相關KeyWord,請至下方連結觀看
參考資料 : 連結

歡迎轉載,請註明出處。

2015年6月16日 星期二

Android-新增資料檔案

新增檔案


public class MainActivity extends Activity {

    private TextView textView;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        textView = (TextView) findViewById(R.id.textView1);
        
        File div = new File(Environment.getExternalStorageDirectory(),
                "MyTestFile/Hello");
        
        if (!div.exists()) {
            div.mkdirs();
            textView.setText("檔案已新增");
        } 
        else
        {
            textView.setText("檔案已存在");
        }
        
    }
}


記得一定要新增權限

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>


歡迎轉載,請註明出處。

2015年6月9日 星期二

Android-自定義 CallBack 行為( Default Callback )

相信各位開發大大們對 CallBack 一定不陌生吧!
不管是 按鍵、藍芽、GPS...等,都一定要實作。
但 CallBack 能夠自定義裡面的傳輸內容嗎?
答案是可以的。

最常見的例子 : 跑背景、非同步執行...等。

這裡就舉簡單的範例,利用 Button 去觸發

1 . 回傳格式介面

public interface HelloCallBack {

    public void success(String strSuccess);
    
}

2 . 回傳內容設定

public class Hello {

    public HelloCallBack _helloCallBack;

    public Hello(HelloCallBack helloCallBack){
        this._helloCallBack = helloCallBack;    
    }
    
    public void speak(){
        // 回傳內容
        _helloCallBack.success(""+(int)(Math.random()*42+1));
    }
    
}

3 . 如果有被 CallBack 觸發(可改為計時),TextView就會被更新

public class MainActivity extends Activity implements OnClickListener, HelloCallBack{

    private TextView textView1;
    private Button btn;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        textView1 = (TextView) findViewById(R.id.textView1);
        btn = (Button) findViewById(R.id.button1);

        btn.setOnClickListener(this);

    }

    @Override
    public void onClick(View v) {
        new Hello(this).speak();
    }

    @Override
    public void success(String strSuccess) {
        textView1.setText(strSuccess);        
    }

}


歡迎轉載,請註明出處。

2015年6月8日 星期一

Androd-連線至Android Device 執行 App

首先設定環境變數
(注意 : 要設定環境變數前,請先複製原本的變數內容)

在 Path 內新增:
1 . D:\Android_SDK\sdk\tools
2 . D:\Android_SDK\sdk\platform-tools


步驟 :
1 . 請先將實體的Android Device 接在 PC 端
2 . 命令提示字元 : adb kill-server
3 . 命令提示字元 : adb devices ( 一定會有一台實體出現在清單 )
4 . 命令提示字元 : adb tcpip 3333
5 . 命令提示字元 :  connect 192.168.1.100:5555

連線安裝
參考資料 : 如何從PC直接安裝APK到手機上,ADB指令教學範例

將手機Logcat 寫進入文字檔
1 . PC 必須要能抓的到 Device
2 . 開啟命令提示字元
3 . 先將目前路徑指向目標路徑
cd C:\Users\Xxx\Desktop\NewFile

4 . 輸入以下參數
adb logcat -v time > MyLogcat.txt


歡迎轉載,請註明出處。

2015年6月6日 星期六

Android-SharedPreferences 使用者偏好

各位大大一定對此不陌生吧
這次我們寫成一個Class 讓之後再次使用更佳的方便

import android.content.Context;
import android.content.SharedPreferences;

public class MemoryClass {

        public static final String PREFERENCES_NAME = "Hello";
        public static final String NAME = "NAME";
        
        public static void setName(Context context,String name) {
                SharedPreferences sp = context.getSharedPreferences(PREFERENCES_NAME,        
                                Context.MODE_PRIVATE);
                sp.edit().putString(NAME, name).commit();
        }
        public static String getName(Context context) {
                SharedPreferences sp = context.getSharedPreferences(PREFERENCES_NAME,        
                                Context.MODE_PRIVATE);
                return sp.getString(NAME, "");
        }
        
}

當我們要調用時,只需要做簡單的呼叫

// 儲存文字內容
MemoryClass.setName(MainActivity.this, "John");

// 讀取指定參數
String name = MemoryClass.getName(MainActivity.this);


歡迎轉載,請註明出處。

2015年6月3日 星期三

Internet-Gateway and router 簡單說明

想必大家對網路周邊裝置一定很好奇
但是卻不知道該如何下手
這裡先整理出一個圖示













簡單的說明 :
Gateway : 將網際網路資訊送至住家內(Gateway)。
Router : 將Gateway接收的訊號藉由指定的位址(Router分配)發送到不同的電腦。

如果本人以上說明有問題,歡迎提出異議,歡迎多多指教。
歡迎轉載,請註明出處。